kanoko 0.0.2 → 0.0.3

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: 2549a6bdda23d33eb4cded2c73a8a4404a5fd017
4
- data.tar.gz: 36ecc1c7d224edbf0c3b82ecd3d8967da52ef741
3
+ metadata.gz: e42bf64558cec67348c3f8b2793079179c5012c1
4
+ data.tar.gz: 6148e4976c50a71236ffe7c1ab8b5b2860f438e1
5
5
  SHA512:
6
- metadata.gz: ba78d7bd762e23ad896a6b0559d5c98dc86e13ca8d82508b19341d6c00712fcc176a7b5c4acc9a9217687782199fab70af08d8be3e0c83f2af8f5205393bb61c
7
- data.tar.gz: 500b00d0fcda53eba841fd2903bd9038d294c1ba21d8e420470c8f3c0bd80adb72b83a166086a8c42fe949902f88c7392657045fa42b6d811ac6b231a511430e
6
+ metadata.gz: 3246a4f831cb4355b0f200e52ef608f5c04a79228a7498c225fbb66efb1aed28dac8a74d5de6fe7ba13bb305848935cfe79c94c4637f8cff994223af2d77d25d
7
+ data.tar.gz: ab2dc0dc148d7a1637b5d6d3ca581b067f68c98778c466d2bb94148a99e7290ae2167ae10e3116887a44d3b0a0db8502a77120ec3daac46bf18dd24b9b1661b2
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.6
4
+ - 2.2.2
@@ -0,0 +1,4 @@
1
+ kanoko
2
+ ===
3
+
4
+ [![Build Status](https://travis-ci.org/spice-life/kanoko.svg?branch=master)](https://travis-ci.org/spice-life/kanoko)
@@ -17,6 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
+ spec.add_dependency "sinatra"
20
21
  spec.add_development_dependency "bundler"
21
22
  spec.add_development_dependency "rake"
22
23
  spec.add_development_dependency "minitest"
@@ -7,6 +7,11 @@ module Kanoko
7
7
  # p Kanoko.configure #=> #<Kanoko::Configure ...>
8
8
  def configure
9
9
  @configure ||= Configure.new
10
+ if block_given?
11
+ yield @configure
12
+ else
13
+ @configure
14
+ end
10
15
  end
11
16
  module_function :configure
12
17
 
@@ -31,7 +36,7 @@ module Kanoko
31
36
 
32
37
  def make_path(func, args, src)
33
38
  hash = make_hash(func, args, src)
34
- "/#{hash}/#{[func, args, src].map{|i| URI.encode_www_form_component(i)}.join('/')}"
39
+ "/#{hash}/#{[func, args].map{|i| URI.encode_www_form_component(i)}.join('/')}/#{src}"
35
40
  end
36
41
  module_function :make_path
37
42
  end
@@ -0,0 +1,121 @@
1
+ require 'sinatra'
2
+ require 'net/http'
3
+ require 'tempfile'
4
+ require 'kanoko'
5
+
6
+ # This is a experimental implementation.
7
+ # You can set configure and other.
8
+ # This application receve url make by Kanoko.url_for().
9
+ # You can choice function that image processing.
10
+ # Image resource can get by url,
11
+ # And that write once to file,
12
+ # And image processing by imagemagick,
13
+ # And that read file binary.
14
+ #
15
+ # example:
16
+ # require 'kanoko/application/convert'
17
+ #
18
+ # ENV['KANOKO_DIGEST_FUNC'] = "sha1"
19
+ # ENV['KANOKO_SECRET_KEY'] = "secret"
20
+ #
21
+ # class MyApp < Kanoko::Application::Convert
22
+ # before do
23
+ # content_type 'image/png'
24
+ # end
25
+ # configure :production do
26
+ # require 'newrelic_rpm'
27
+ # end
28
+ # end
29
+ #
30
+ # run MyApp
31
+ module Kanoko
32
+ module Application
33
+ class Convert < Sinatra::Application
34
+ get '/:hash/:func/:args/*' do
35
+ hash = params[:hash]
36
+ func = params[:func]
37
+ args = params[:args]
38
+ src_path = env["REQUEST_URI"].sub(%r{/.*?/.*?/.*?/(.*)}, '\1')
39
+
40
+ unless hash == Kanoko.make_hash(func, args, src_path)
41
+ logger.error "hash check failed #{[func, args, src_path]}"
42
+ return 400
43
+ end
44
+
45
+ res = http_get(URI.parse("#{(request.secure? ? 'https' : 'http')}://#{src_path}"))
46
+ if res.nil?
47
+ return 404
48
+ end
49
+ after_response res
50
+
51
+ Tempfile.open("src") do |src_file|
52
+ src_file.write res.body
53
+ src_file.fdatasync
54
+ Tempfile.open("dst") do |dst_file|
55
+ default_env = {"OMP_NUM_THREADS" => "1"}
56
+ result = case func.to_sym
57
+
58
+ when :crop
59
+ system(default_env,
60
+ 'convert',
61
+ '-thumbnail', "#{args}^",
62
+ '-gravity', 'north',
63
+ '-extent', args,
64
+ '-background', 'transparent',
65
+ '-depth', '8',
66
+ src_file.path, dst_file.path)
67
+
68
+ when :resize
69
+ system(default_env,
70
+ 'convert',
71
+ '-thumbnail', args,
72
+ '-depth', '8',
73
+ src_file.path, dst_file.path)
74
+
75
+ else
76
+ logger.error "undefined func #{func}"
77
+ return 400
78
+ end
79
+
80
+ unless result
81
+ logger.error "command fail $?=#{$?.inspect}"
82
+ return 500
83
+ end
84
+ dst_file.read
85
+ end
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ def http_get(uri)
92
+ retries = 2
93
+ req = Net::HTTP::Get.new(uri.request_uri)
94
+ http = Net::HTTP.new(uri.host, uri.port)
95
+ http.read_timeout = 1
96
+ http.use_ssl = true if uri.scheme == 'https'
97
+ begin
98
+ res = http.start do |http|
99
+ http.request(req)
100
+ end
101
+ res.value
102
+ res
103
+ rescue => e
104
+ if 1 < retries
105
+ retries -= 1
106
+ sleep rand(0..0.3)
107
+ retry
108
+ end
109
+ logger.error "Can not get image from '#{uri}' with #{e.message}"
110
+ nil
111
+ end
112
+ end
113
+
114
+ def after_response(res)
115
+ res.each do |key, value|
116
+ headers[key] ||= value
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -12,7 +12,7 @@ module Kanoko
12
12
  # hash_proc expect Proc
13
13
  #
14
14
  # example:
15
- # Kanoko.configure.tap do |c|
15
+ # Kanoko.configure do |c|
16
16
  # c.kanoko_host = "http://example.com"
17
17
  # c.digest_func = "sha1"
18
18
  # c.secret_key = "secret"
@@ -20,8 +20,8 @@ module Kanoko
20
20
  # Kanoko.url_for(:resize, "100x100") #=> "http://example.com/.../.../..."
21
21
  def initialize
22
22
  @kanoko_host = nil
23
- @digest_func = nil
24
- @secret_key = nil
23
+ @digest_func = ENV['KANOKO_DIGEST_FUNC']
24
+ @secret_key = ENV['KANOKO_SECRET_KEY']
25
25
  @hash_proc = ->(*args){
26
26
  if @digest_func.nil? || @secret_key.nil?
27
27
  fail ConfigureError, "`digest_func' and `secret_key' must be set"
@@ -1,3 +1,3 @@
1
1
  module Kanoko
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -28,7 +28,7 @@ class TestKanoko < Minitest::Test
28
28
  def test_url_for_with_default_hash_proc
29
29
  change_hash_proc(proc{ "aaa" }) do
30
30
  assert_equal "http://example.com/aaa/test_func/test_args/test_path", Kanoko.url_for(:test_func, "test_args", "test_path")
31
- assert_equal "http://example.com/aaa/test_func/%2F%3F-_%3D%21%40%23%3C%3E%5C/%2F%3F-_%3D%21%40%23%3C%3E%5C", Kanoko.url_for(:test_func, "/?-_=!@#<>\\", "/?-_=!@#<>\\")
31
+ assert_equal "http://example.com/aaa/test_func/%2F%3F-_%3D%21%40%23%3C%3E%5C//?-_=!@#<>\\", Kanoko.url_for(:test_func, "/?-_=!@#<>\\", "/?-_=!@#<>\\")
32
32
  end
33
33
  end
34
34
 
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kanoko
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - ksss
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-09 00:00:00.000000000 Z
11
+ date: 2015-05-11 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sinatra
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -60,11 +74,14 @@ extensions: []
60
74
  extra_rdoc_files: []
61
75
  files:
62
76
  - ".gitignore"
77
+ - ".travis.yml"
63
78
  - Gemfile
64
79
  - LICENSE.txt
80
+ - README.md
65
81
  - Rakefile
66
82
  - kanoko.gemspec
67
83
  - lib/kanoko.rb
84
+ - lib/kanoko/application/convert.rb
68
85
  - lib/kanoko/configure.rb
69
86
  - lib/kanoko/errors.rb
70
87
  - lib/kanoko/version.rb