kanoko 0.2.0 → 0.3.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/.travis.yml +3 -2
- data/kanoko.gemspec +2 -1
- data/lib/kanoko.rb +1 -1
- data/lib/kanoko/application/convert.rb +38 -9
- data/lib/kanoko/application/convert/function.rb +7 -1
- data/lib/kanoko/configure.rb +7 -5
- data/lib/kanoko/version.rb +1 -1
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c8ae72b9c1732baa61ae18d0454a30d2a246fcd
|
4
|
+
data.tar.gz: 2e1122b7b11dce472368b5e252a25a44aeef57b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8ecc2d16be738fa47c45e2c55c544a5aca200d2184b023bea55ef17441df0eafcf817e701759189c3a27f0b9dcf1f07523ed8a4cc6e5b1e9d1ddda864e8dae1
|
7
|
+
data.tar.gz: 3e56068dc8148d8b230bf768b08549561b0da67328a1065d1ed2c011d1dc99cc4f4272bd0be280d9b27f8011b4b70c5281c8cc8c55b95bd6b3a9bbc15bd2e9dc
|
data/.travis.yml
CHANGED
data/kanoko.gemspec
CHANGED
@@ -15,7 +15,8 @@ Gem::Specification.new do |spec|
|
|
15
15
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
16
16
|
spec.require_paths = ["lib"]
|
17
17
|
|
18
|
-
spec.
|
18
|
+
spec.add_development_dependency "sinatra"
|
19
|
+
spec.add_development_dependency "mime-types"
|
19
20
|
spec.add_development_dependency "bundler"
|
20
21
|
spec.add_development_dependency "rake"
|
21
22
|
spec.add_development_dependency "minitest"
|
data/lib/kanoko.rb
CHANGED
@@ -24,7 +24,7 @@ module Kanoko
|
|
24
24
|
|
25
25
|
def path_for(*function, src)
|
26
26
|
hash = make_hash(*function, src)
|
27
|
-
"/#{hash}/#{function.map{ |i| URI.encode_www_form_component(i) }.join('/')}/#{src}"
|
27
|
+
"/#{hash}/#{function.map { |i| URI.encode_www_form_component(i) }.join('/')}/#{src}"
|
28
28
|
end
|
29
29
|
module_function :path_for
|
30
30
|
|
@@ -2,6 +2,7 @@ require 'sinatra'
|
|
2
2
|
require 'net/http'
|
3
3
|
require 'tempfile'
|
4
4
|
require 'kanoko'
|
5
|
+
require 'mime/types'
|
5
6
|
|
6
7
|
# This is an experimental implementation.
|
7
8
|
# You can set configure and other.
|
@@ -33,6 +34,18 @@ module Kanoko
|
|
33
34
|
class Convert < Sinatra::Application
|
34
35
|
require 'kanoko/application/convert/function'
|
35
36
|
|
37
|
+
IMAGE_TYPES = MIME::Types.select do |m|
|
38
|
+
m.media_type == 'image'
|
39
|
+
end
|
40
|
+
TYPE_MAP = IMAGE_TYPES.map { |i|
|
41
|
+
[i.to_s, i.preferred_extension]
|
42
|
+
}.to_h
|
43
|
+
EXT_MAP = IMAGE_TYPES.each_with_object({}) do |i, h|
|
44
|
+
i.extensions.each do |ext|
|
45
|
+
h[ext] = i.to_s
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
36
49
|
# /123abc456def=/resize/200x200/crop/100x100/path/to/src
|
37
50
|
get '/:hash/*' do
|
38
51
|
# REQUEST_URI dependent on unicorn.
|
@@ -48,13 +61,16 @@ module Kanoko
|
|
48
61
|
list = Kanoko::Application::Convert::Function.list
|
49
62
|
convert_options = []
|
50
63
|
arguments = []
|
51
|
-
|
64
|
+
to_ext = File.extname(request_params.last)[1..-1]
|
52
65
|
while id = request_params.shift.to_sym
|
53
|
-
if
|
66
|
+
if id == :to
|
67
|
+
to_ext = request_params.shift
|
68
|
+
arguments << id << to_ext
|
69
|
+
elsif list.include?(id)
|
54
70
|
arguments << id
|
55
71
|
method = Function.new.method(id)
|
56
72
|
arg = request_params.shift(method.arity)
|
57
|
-
arg.map!{|i| URI.decode_www_form_component i}
|
73
|
+
arg.map! { |i| URI.decode_www_form_component i }
|
58
74
|
arguments.concat arg if 0 < arg.length
|
59
75
|
convert_options.concat method.call(*arg)
|
60
76
|
else
|
@@ -63,7 +79,7 @@ module Kanoko
|
|
63
79
|
end
|
64
80
|
end
|
65
81
|
|
66
|
-
check_path = request_params.map{ |i| URI.decode_www_form_component(i) }.join('/')
|
82
|
+
check_path = request_params.map { |i| URI.decode_www_form_component(i) }.join('/')
|
67
83
|
unless hash == Kanoko.make_hash(*arguments, check_path)
|
68
84
|
logger.error "hash check failed #{[*arguments, check_path]}"
|
69
85
|
return 400
|
@@ -80,22 +96,35 @@ module Kanoko
|
|
80
96
|
src_file.write res.body
|
81
97
|
src_file.fdatasync
|
82
98
|
|
83
|
-
|
99
|
+
t = TYPE_MAP[res.content_type]
|
100
|
+
src_type = if t
|
101
|
+
"#{t}:"
|
102
|
+
else
|
103
|
+
""
|
104
|
+
end
|
105
|
+
|
106
|
+
dst_name = if to_ext.nil?
|
107
|
+
"dst"
|
108
|
+
else
|
109
|
+
["dst", ".#{to_ext}"]
|
110
|
+
end
|
111
|
+
Tempfile.create(dst_name) do |dst_file|
|
84
112
|
system_command = [
|
85
|
-
{"OMP_NUM_THREADS" => "1"},
|
113
|
+
{ "OMP_NUM_THREADS" => "1" },
|
86
114
|
'convert',
|
87
115
|
'-depth', '8',
|
88
116
|
convert_options,
|
89
|
-
src_file.path,
|
90
|
-
dst_file.path
|
117
|
+
"#{src_type}#{src_file.path}",
|
118
|
+
dst_file.path,
|
91
119
|
].flatten
|
92
120
|
result = system *system_command
|
93
121
|
|
94
122
|
unless result
|
95
|
-
logger.error "command fail $?=#{
|
123
|
+
logger.error "command fail $?=#{$CHILD_STATUS.inspect}"
|
96
124
|
return 500
|
97
125
|
end
|
98
126
|
|
127
|
+
content_type EXT_MAP[to_ext]
|
99
128
|
dst_file.read
|
100
129
|
end
|
101
130
|
end
|
data/lib/kanoko/configure.rb
CHANGED
@@ -19,16 +19,18 @@ module Kanoko
|
|
19
19
|
def initialize
|
20
20
|
@digest_func = ENV['KANOKO_DIGEST_FUNC']
|
21
21
|
@secret_key = ENV['KANOKO_SECRET_KEY']
|
22
|
-
@hash_proc =
|
22
|
+
@hash_proc = lambda do |*args|
|
23
23
|
if @digest_func.nil? || @secret_key.nil?
|
24
24
|
fail ConfigureError, "`digest_func' and `secret_key' must be set"
|
25
25
|
end
|
26
26
|
Base64.urlsafe_encode64(
|
27
|
-
OpenSSL::HMAC.digest
|
28
|
-
|
29
|
-
|
27
|
+
OpenSSL::HMAC.digest(
|
28
|
+
@digest_func,
|
29
|
+
@secret_key,
|
30
|
+
args.map(&:to_s).join(','),
|
31
|
+
),
|
30
32
|
)
|
31
|
-
|
33
|
+
end
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
data/lib/kanoko/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kanoko
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ksss
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -17,7 +17,21 @@ dependencies:
|
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
|
-
type: :
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mime-types
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
@@ -135,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
149
|
version: '0'
|
136
150
|
requirements: []
|
137
151
|
rubyforge_project:
|
138
|
-
rubygems_version: 2.
|
152
|
+
rubygems_version: 2.5.1
|
139
153
|
signing_key:
|
140
154
|
specification_version: 4
|
141
155
|
summary: kanoko is a active image generater library.
|