tinplate 1.1.0 → 2.1.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/Gemfile +2 -2
- data/README.md +15 -7
- data/lib/tinplate/configuration.rb +1 -7
- data/lib/tinplate/search_results.rb +2 -3
- data/lib/tinplate/tineye.rb +16 -11
- data/lib/tinplate/version.rb +1 -1
- data/tinplate.gemspec +3 -3
- metadata +18 -13
- data/lib/tinplate/request_authenticator.rb +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd4d09eedc78227f59705e1178ce27d024270fe2
|
4
|
+
data.tar.gz: ac0c1b55d669aad4ca94b24cfec7802aae73ed33
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87de49e77f7b78d21a613390a47443e1b6b44602b64f0faf2fb6dd8dacb184e91b0dc5319f9e47eb4c2dd0f4ce1c76ddf13f08a3927a82652a2684830abf5184
|
7
|
+
data.tar.gz: e1496130dcde0c1484a2adba0f989fe6a6cf087be4c915aaa59ca81d474d7ca3c07bb67c938a9a3773f86b87ee32d5b55056735b5c6a17e927288359ebf82d37
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -12,11 +12,15 @@ gem 'tinplate'
|
|
12
12
|
|
13
13
|
And then execute:
|
14
14
|
|
15
|
-
|
15
|
+
```bash
|
16
|
+
$ bundle
|
17
|
+
```
|
16
18
|
|
17
19
|
Or install it yourself as:
|
18
20
|
|
19
|
-
|
21
|
+
```bash
|
22
|
+
$ gem install tinplate
|
23
|
+
```
|
20
24
|
|
21
25
|
## Configuration
|
22
26
|
|
@@ -24,7 +28,6 @@ First you've got to let Tinplate know what your TinEye API keys are. In a Rails
|
|
24
28
|
|
25
29
|
```ruby
|
26
30
|
Tinplate.configure do |config|
|
27
|
-
config.public_key = "YOUR PUBLIC API KEY"
|
28
31
|
config.private_key = "YOUR PRIVATE API KEY"
|
29
32
|
config.test = false
|
30
33
|
end
|
@@ -49,9 +52,9 @@ There are only three API actions available: `search`, `remaining_searches` (to c
|
|
49
52
|
tineye = Tinplate::TinEye.new
|
50
53
|
results = tineye.search(image_url: "http://example.com/photo.jpg")
|
51
54
|
|
52
|
-
results.total_results # => 2
|
53
|
-
results.total_backlinks # => 3
|
54
|
-
results.matches
|
55
|
+
results.stats.total_results # => 2
|
56
|
+
results.stats.total_backlinks # => 3
|
57
|
+
results.matches # => an Array of matched images (see below)
|
55
58
|
|
56
59
|
results.matches.each do |match|
|
57
60
|
# Do what you like with this matched image. The world is your oyster.
|
@@ -77,9 +80,14 @@ results = tineye.search(image_path: "/home/alice/example.jpg")
|
|
77
80
|
An `OpenStruct` object with the following attributes (/w example values):
|
78
81
|
|
79
82
|
```ruby
|
83
|
+
domain: "ucsb.edu",
|
84
|
+
top_level_domain: "ucsb.edu",
|
80
85
|
width: 400
|
81
86
|
height: 300
|
82
|
-
size: 50734
|
87
|
+
size: 50734,
|
88
|
+
filesize: 195840,
|
89
|
+
score: 88.9,
|
90
|
+
tags: ["collection"],
|
83
91
|
image_url: "http://images.tineye.com/result/0f1e84b7b7538e8e7de048f4d45eb8f579e3e999941b3341ed9a754eb447ebb1",
|
84
92
|
format: "JPEG",
|
85
93
|
contributor: true,
|
@@ -2,10 +2,8 @@ module Tinplate # :nodoc:
|
|
2
2
|
class Configuration # :nodoc:
|
3
3
|
|
4
4
|
# https://services.tineye.com/developers/tineyeapi/sandbox.html
|
5
|
-
SANDBOX_PUBLIC_KEY = "LCkn,2K7osVwkX95K4Oy"
|
6
5
|
SANDBOX_PRIVATE_KEY = "6mm60lsCNIB,FwOWjJqA80QZHh9BMwc-ber4u=t^"
|
7
6
|
|
8
|
-
attr_writer :public_key
|
9
7
|
attr_writer :private_key
|
10
8
|
attr_writer :test
|
11
9
|
|
@@ -17,13 +15,9 @@ module Tinplate # :nodoc:
|
|
17
15
|
!!@test
|
18
16
|
end
|
19
17
|
|
20
|
-
def public_key
|
21
|
-
test? ? SANDBOX_PUBLIC_KEY : @public_key
|
22
|
-
end
|
23
|
-
|
24
18
|
def private_key
|
25
19
|
test? ? SANDBOX_PRIVATE_KEY : @private_key
|
26
20
|
end
|
27
21
|
|
28
22
|
end
|
29
|
-
end
|
23
|
+
end
|
@@ -1,9 +1,8 @@
|
|
1
1
|
module Tinplate
|
2
2
|
class SearchResults < OpenStruct
|
3
3
|
def initialize(data)
|
4
|
-
super
|
5
|
-
|
6
|
-
matches: parsed_matches(data["matches"])
|
4
|
+
super stats: OpenStruct.new(data["stats"]),
|
5
|
+
matches: parsed_matches(data["results"]["matches"])
|
7
6
|
end
|
8
7
|
|
9
8
|
private
|
data/lib/tinplate/tineye.rb
CHANGED
@@ -18,14 +18,19 @@ module Tinplate
|
|
18
18
|
|
19
19
|
response = request("search", options.merge(img))
|
20
20
|
|
21
|
-
Tinplate::SearchResults.new(response
|
21
|
+
Tinplate::SearchResults.new(response)
|
22
22
|
end
|
23
23
|
|
24
24
|
def remaining_searches
|
25
25
|
results = request("remaining_searches")["results"]
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
|
27
|
+
bundles = results["bundles"].map do |bundle|
|
28
|
+
OpenStruct.new(remaining_searches: bundle["remaining_searches"],
|
29
|
+
start_date: Time.parse(bundle["start_date"]),
|
30
|
+
expire_date: Time.parse(bundle["expire_date"]))
|
31
|
+
end
|
32
|
+
|
33
|
+
OpenStruct.new(total_remaining_searches: results["total_remaining_searches"], bundles: bundles)
|
29
34
|
end
|
30
35
|
|
31
36
|
def image_count
|
@@ -42,12 +47,12 @@ module Tinplate
|
|
42
47
|
Faraday::UploadIO.new(params.delete(:image_path), "image/jpeg")
|
43
48
|
end
|
44
49
|
|
45
|
-
auth = Tinplate::RequestAuthenticator.new(action, params, upload && upload.original_filename)
|
46
|
-
params.merge!(auth.params)
|
47
|
-
|
48
50
|
params.merge!(image_upload: upload) if upload
|
49
51
|
|
50
|
-
|
52
|
+
headers = { "x-api-key" => Tinplate.configuration.private_key }
|
53
|
+
|
54
|
+
response = connection.send(http_verb, "#{action}/", params, headers)
|
55
|
+
response = ::JSON.parse(response.body)
|
51
56
|
|
52
57
|
if response["code"] != 200
|
53
58
|
raise Tinplate::Error.from_response(response["code"], response["messages"][0], response["messages"][1])
|
@@ -58,9 +63,9 @@ module Tinplate
|
|
58
63
|
|
59
64
|
def connection
|
60
65
|
@conn ||= Faraday.new(url: "https://api.tineye.com/rest/") do |faraday|
|
61
|
-
faraday.request
|
62
|
-
faraday.request
|
63
|
-
faraday.adapter
|
66
|
+
faraday.request :multipart
|
67
|
+
faraday.request :url_encoded
|
68
|
+
faraday.adapter Faraday.default_adapter
|
64
69
|
end
|
65
70
|
end
|
66
71
|
|
data/lib/tinplate/version.rb
CHANGED
data/tinplate.gemspec
CHANGED
@@ -19,10 +19,10 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.add_dependency "faraday", "
|
22
|
+
spec.add_dependency "faraday", [">= 0.9.2", "< 2.0.0"]
|
23
23
|
|
24
|
-
spec.add_development_dependency "bundler", "
|
25
|
-
spec.add_development_dependency "rake", "
|
24
|
+
spec.add_development_dependency "bundler", ">= 2.2.10"
|
25
|
+
spec.add_development_dependency "rake", ">= 12.3.3"
|
26
26
|
spec.add_development_dependency "rspec", "~> 3.4.0"
|
27
27
|
spec.add_development_dependency "pry"
|
28
28
|
end
|
metadata
CHANGED
@@ -1,57 +1,63 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tinplate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Klaassen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 0.9.2
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.0.0
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
|
-
- - "
|
27
|
+
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: 0.9.2
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.0.0
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: bundler
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
|
-
- - "
|
37
|
+
- - ">="
|
32
38
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
39
|
+
version: 2.2.10
|
34
40
|
type: :development
|
35
41
|
prerelease: false
|
36
42
|
version_requirements: !ruby/object:Gem::Requirement
|
37
43
|
requirements:
|
38
|
-
- - "
|
44
|
+
- - ">="
|
39
45
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
46
|
+
version: 2.2.10
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
48
|
name: rake
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
44
50
|
requirements:
|
45
|
-
- - "
|
51
|
+
- - ">="
|
46
52
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
53
|
+
version: 12.3.3
|
48
54
|
type: :development
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
51
57
|
requirements:
|
52
|
-
- - "
|
58
|
+
- - ">="
|
53
59
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
60
|
+
version: 12.3.3
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
62
|
name: rspec
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -99,7 +105,6 @@ files:
|
|
99
105
|
- lib/tinplate.rb
|
100
106
|
- lib/tinplate/configuration.rb
|
101
107
|
- lib/tinplate/errors.rb
|
102
|
-
- lib/tinplate/request_authenticator.rb
|
103
108
|
- lib/tinplate/search_results.rb
|
104
109
|
- lib/tinplate/tineye.rb
|
105
110
|
- lib/tinplate/version.rb
|
@@ -1,59 +0,0 @@
|
|
1
|
-
# https://services.tineye.com/developers/tineyeapi/authentication.html
|
2
|
-
|
3
|
-
require "securerandom"
|
4
|
-
require "uri"
|
5
|
-
|
6
|
-
module Tinplate
|
7
|
-
class RequestAuthenticator
|
8
|
-
|
9
|
-
def initialize(action, params = {}, image_name = "")
|
10
|
-
@action = action
|
11
|
-
@params = params
|
12
|
-
@image_name = image_name || ""
|
13
|
-
@nonce = SecureRandom.hex
|
14
|
-
@date = Time.now.to_i
|
15
|
-
end
|
16
|
-
|
17
|
-
def params
|
18
|
-
{
|
19
|
-
api_key: Tinplate.configuration.public_key,
|
20
|
-
api_sig: signature,
|
21
|
-
nonce: @nonce,
|
22
|
-
date: @date
|
23
|
-
}
|
24
|
-
end
|
25
|
-
|
26
|
-
def verb
|
27
|
-
@image_name.empty? ? "GET" : "POST"
|
28
|
-
end
|
29
|
-
|
30
|
-
def content_type
|
31
|
-
verb == "GET" ? "" : "multipart/form-data; boundary=-----------RubyMultipartPost"
|
32
|
-
end
|
33
|
-
|
34
|
-
def signature_components
|
35
|
-
[
|
36
|
-
Tinplate.configuration.private_key,
|
37
|
-
verb,
|
38
|
-
content_type,
|
39
|
-
URI.encode_www_form_component(@image_name).downcase,
|
40
|
-
@date.to_i,
|
41
|
-
@nonce,
|
42
|
-
"https://api.tineye.com/rest/#{@action}/",
|
43
|
-
hash_to_sorted_query_string(@params),
|
44
|
-
]
|
45
|
-
end
|
46
|
-
|
47
|
-
def signature
|
48
|
-
OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha1"),
|
49
|
-
Tinplate.configuration.private_key,
|
50
|
-
signature_components.join)
|
51
|
-
end
|
52
|
-
|
53
|
-
def hash_to_sorted_query_string(params)
|
54
|
-
Hash[params.sort].map do |key, value|
|
55
|
-
"#{key}=#{URI.encode_www_form_component(value)}"
|
56
|
-
end.join("&")
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|