remove_bg 1.4.0 → 1.4.1
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/.circleci/config.yml +9 -6
- data/.gitignore +2 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +14 -8
- data/README.md +16 -0
- data/gemfiles/faraday_0_15.gemfile +4 -0
- data/gemfiles/faraday_0_16.gemfile +4 -0
- data/gemfiles/faraday_0_17.gemfile +4 -0
- data/gemfiles/faraday_1_x.gemfile +4 -0
- data/lib/remove_bg/api.rb +0 -12
- data/lib/remove_bg/api_client.rb +11 -6
- data/lib/remove_bg/composite_result.rb +8 -5
- data/lib/remove_bg/error.rb +9 -0
- data/lib/remove_bg/rate_limit_info.rb +34 -0
- data/lib/remove_bg/result.rb +9 -6
- data/lib/remove_bg/result_metadata.rb +14 -0
- data/lib/remove_bg/version.rb +1 -1
- data/remove_bg.gemspec +1 -2
- metadata +7 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 728a996008009c54dc10d72f0b0db353b1156182a8379c51ed0cf5f9fbe4b27e
|
4
|
+
data.tar.gz: 991a7201af58af739e73af965d082b43a0427d79878e0db2f17d13c3ac575053
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2800e1a449e12e3168c7e15d9fd85b8424434ff568821600464a05d6448529e22514ab1e80cdd7c76c7a6ab91e45db01f99b7a7e7dab617d00b797f6788aa872
|
7
|
+
data.tar.gz: 556b0ded824694cffb639cab278eb00ffea8df314c5beee20a2565528671d8548fb856a3d14a52af73c5147f54d016b457268101046ce6c75647fb0a6b606c61
|
data/.circleci/config.yml
CHANGED
@@ -11,7 +11,10 @@ base_job: &base_job
|
|
11
11
|
|
12
12
|
- run:
|
13
13
|
name: install dependencies
|
14
|
-
command:
|
14
|
+
command: |
|
15
|
+
gem install bundler --version '~> 2.0'
|
16
|
+
bundle config set path vendor/bundle
|
17
|
+
bundle install --jobs=4 --retry=3
|
15
18
|
|
16
19
|
- run:
|
17
20
|
name: install image processsing dependencies
|
@@ -43,10 +46,6 @@ base_job: &base_job
|
|
43
46
|
################################################################################
|
44
47
|
|
45
48
|
jobs:
|
46
|
-
ruby-2.4:
|
47
|
-
<<: *base_job
|
48
|
-
docker:
|
49
|
-
- image: circleci/ruby:2.4
|
50
49
|
ruby-2.5:
|
51
50
|
<<: *base_job
|
52
51
|
docker:
|
@@ -55,6 +54,10 @@ jobs:
|
|
55
54
|
<<: *base_job
|
56
55
|
docker:
|
57
56
|
- image: circleci/ruby:2.6
|
57
|
+
ruby-2.7:
|
58
|
+
<<: *base_job
|
59
|
+
docker:
|
60
|
+
- image: circleci/ruby:2.7
|
58
61
|
|
59
62
|
################################################################################
|
60
63
|
|
@@ -62,6 +65,6 @@ workflows:
|
|
62
65
|
version: 2
|
63
66
|
multiple-rubies:
|
64
67
|
jobs:
|
65
|
-
- ruby-2.4
|
66
68
|
- ruby-2.5
|
67
69
|
- ruby-2.6
|
70
|
+
- ruby-2.7
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.4.1
|
4
|
+
|
5
|
+
- Fixes binary encoding issue - via [#15](https://github.com/remove-bg/ruby/pull/15)
|
6
|
+
|
3
7
|
## 1.4.0
|
4
8
|
|
5
9
|
- Adds support for images up to 25 megapixels ([documentation](https://github.com/remove-bg/ruby#processing-images-over-10-megapixels))
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,17 @@
|
|
1
|
+
GIT
|
2
|
+
remote: https://github.com/thoughtbot/appraisal.git
|
3
|
+
revision: 586864393e405a67b1457b563a4d5adc99e50e2d
|
4
|
+
ref: 5868643
|
5
|
+
specs:
|
6
|
+
appraisal (2.2.0)
|
7
|
+
bundler
|
8
|
+
rake
|
9
|
+
thor (>= 0.14.0)
|
10
|
+
|
1
11
|
PATH
|
2
12
|
remote: .
|
3
13
|
specs:
|
4
|
-
remove_bg (1.4.
|
14
|
+
remove_bg (1.4.1)
|
5
15
|
faraday (>= 0.15, < 2)
|
6
16
|
image_processing (>= 1.9, < 2)
|
7
17
|
rubyzip (>= 2.0, < 3)
|
@@ -11,10 +21,6 @@ GEM
|
|
11
21
|
specs:
|
12
22
|
addressable (2.7.0)
|
13
23
|
public_suffix (>= 2.0.2, < 5.0)
|
14
|
-
appraisal (2.2.0)
|
15
|
-
bundler
|
16
|
-
rake
|
17
|
-
thor (>= 0.14.0)
|
18
24
|
coderay (1.1.2)
|
19
25
|
crack (0.4.3)
|
20
26
|
safe_yaml (~> 1.0.0)
|
@@ -67,8 +73,8 @@ PLATFORMS
|
|
67
73
|
ruby
|
68
74
|
|
69
75
|
DEPENDENCIES
|
70
|
-
appraisal
|
71
|
-
bundler (~>
|
76
|
+
appraisal!
|
77
|
+
bundler (~> 2.0)
|
72
78
|
dotenv
|
73
79
|
pry
|
74
80
|
rake
|
@@ -80,4 +86,4 @@ DEPENDENCIES
|
|
80
86
|
webmock
|
81
87
|
|
82
88
|
BUNDLED WITH
|
83
|
-
1.
|
89
|
+
2.1.4
|
data/README.md
CHANGED
@@ -102,6 +102,22 @@ result.save("result-with-transparency.png")
|
|
102
102
|
result.save_zip("result.zip") # If you want to handle composition yourself
|
103
103
|
```
|
104
104
|
|
105
|
+
#### Rate limits
|
106
|
+
|
107
|
+
The [API has rate limits][rate-limits]. Image processing results include the
|
108
|
+
rate limit information:
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
result = RemoveBg.from_file("image.jpg")
|
112
|
+
result.rate_limit.to_s
|
113
|
+
# => <RateLimit reset_at='2020-05-20T12:00:00Z' total=500 remaining=499 retry_after_seconds=nil>
|
114
|
+
```
|
115
|
+
|
116
|
+
If you exceed the rate limit a `RemoveBg::RateLimitError` exception will be
|
117
|
+
raised. This also contains further information via the `#rate_limit` method.
|
118
|
+
|
119
|
+
[rate-limits]: https://www.remove.bg/api#rate-limit
|
120
|
+
|
105
121
|
### Fetching account information
|
106
122
|
|
107
123
|
To display the [account information][account-info] for the currently configured
|
data/lib/remove_bg/api.rb
CHANGED
@@ -10,17 +10,5 @@ module RemoveBg
|
|
10
10
|
|
11
11
|
HEADER_API_KEY = "X-Api-Key"
|
12
12
|
private_constant :HEADER_API_KEY
|
13
|
-
|
14
|
-
HEADER_TYPE = "X-Type"
|
15
|
-
private_constant :HEADER_TYPE
|
16
|
-
|
17
|
-
HEADER_WIDTH = "X-Width"
|
18
|
-
private_constant :HEADER_WIDTH
|
19
|
-
|
20
|
-
HEADER_HEIGHT = "X-Height"
|
21
|
-
private_constant :HEADER_HEIGHT
|
22
|
-
|
23
|
-
HEADER_CREDITS_CHARGED = "X-Credits-Charged"
|
24
|
-
private_constant :HEADER_CREDITS_CHARGED
|
25
13
|
end
|
26
14
|
end
|
data/lib/remove_bg/api_client.rb
CHANGED
@@ -6,6 +6,8 @@ require_relative "api"
|
|
6
6
|
require_relative "composite_result"
|
7
7
|
require_relative "error"
|
8
8
|
require_relative "http_connection"
|
9
|
+
require_relative "rate_limit_info"
|
10
|
+
require_relative "result_metadata"
|
9
11
|
require_relative "result"
|
10
12
|
require_relative "upload"
|
11
13
|
require_relative "url_validator"
|
@@ -39,6 +41,8 @@ module RemoveBg
|
|
39
41
|
|
40
42
|
def request_remove_bg(data, api_key)
|
41
43
|
download = Tempfile.new("remove-bg-download")
|
44
|
+
download.binmode
|
45
|
+
|
42
46
|
streaming = false
|
43
47
|
|
44
48
|
response = connection.post(V1_REMOVE_BG, data) do |req|
|
@@ -83,12 +87,15 @@ module RemoveBg
|
|
83
87
|
end
|
84
88
|
|
85
89
|
def handle_http_error(response:, body:)
|
90
|
+
error_message = parse_error_message(body)
|
91
|
+
|
86
92
|
case response.status
|
93
|
+
when 429
|
94
|
+
rate_limit = RateLimitInfo.new(response.headers)
|
95
|
+
raise RemoveBg::RateLimitError.new(error_message, response, body, rate_limit)
|
87
96
|
when 400..499
|
88
|
-
error_message = parse_error_message(body)
|
89
97
|
raise RemoveBg::ClientHttpError.new(error_message, response, body)
|
90
98
|
when 500..599
|
91
|
-
error_message = parse_error_message(body)
|
92
99
|
raise RemoveBg::ServerHttpError.new(error_message, response, body)
|
93
100
|
else
|
94
101
|
raise RemoveBg::HttpError.new("An unknown error occurred", response, body)
|
@@ -98,10 +105,8 @@ module RemoveBg
|
|
98
105
|
def parse_image_result(headers:, download:)
|
99
106
|
result_for_content_type(headers["Content-Type"]).new(
|
100
107
|
download: download,
|
101
|
-
|
102
|
-
|
103
|
-
height: headers[HEADER_HEIGHT]&.to_i,
|
104
|
-
credits_charged: headers[HEADER_CREDITS_CHARGED]&.to_f,
|
108
|
+
metadata: ResultMetadata.new(headers),
|
109
|
+
rate_limit: RateLimitInfo.new(headers)
|
105
110
|
)
|
106
111
|
end
|
107
112
|
|
@@ -18,18 +18,17 @@ module RemoveBg
|
|
18
18
|
|
19
19
|
def composite_file
|
20
20
|
@composite_file ||= begin
|
21
|
-
|
22
|
-
compose_to_file(file)
|
23
|
-
end
|
21
|
+
binary_tempfile(["composed", ".png"])
|
22
|
+
.tap { |file| compose_to_file(file) }
|
24
23
|
end
|
25
24
|
end
|
26
25
|
|
27
26
|
def color_file
|
28
|
-
@color_file ||=
|
27
|
+
@color_file ||= binary_tempfile(["color", ".jpg"])
|
29
28
|
end
|
30
29
|
|
31
30
|
def alpha_file
|
32
|
-
@alpha_file ||=
|
31
|
+
@alpha_file ||= binary_tempfile(["alpha", ".png"])
|
33
32
|
end
|
34
33
|
|
35
34
|
def compose_to_file(destination)
|
@@ -48,5 +47,9 @@ module RemoveBg
|
|
48
47
|
zf.find_entry("alpha.png").extract(alpha_file.path) { true }
|
49
48
|
end
|
50
49
|
end
|
50
|
+
|
51
|
+
def binary_tempfile(basename)
|
52
|
+
Tempfile.new(basename).tap { |file| file.binmode }
|
53
|
+
end
|
51
54
|
end
|
52
55
|
end
|
data/lib/remove_bg/error.rb
CHANGED
@@ -14,6 +14,15 @@ module RemoveBg
|
|
14
14
|
class ClientHttpError < HttpError; end
|
15
15
|
class ServerHttpError < HttpError; end
|
16
16
|
|
17
|
+
class RateLimitError < ClientHttpError
|
18
|
+
attr_reader :rate_limit
|
19
|
+
|
20
|
+
def initialize(message, http_response, http_response_body, rate_limit)
|
21
|
+
@rate_limit = rate_limit
|
22
|
+
super(message, http_response, http_response_body)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
17
26
|
class FileError < Error
|
18
27
|
attr_reader :file_path
|
19
28
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "time"
|
2
|
+
|
3
|
+
module RemoveBg
|
4
|
+
class RateLimitInfo
|
5
|
+
attr_reader :total, :remaining, :retry_after_seconds
|
6
|
+
|
7
|
+
def initialize(headers)
|
8
|
+
@total = headers["X-RateLimit-Limit"]&.to_i
|
9
|
+
@remaining = headers["X-RateLimit-Remaining"]&.to_i
|
10
|
+
@reset_timestamp = headers["X-RateLimit-Reset"]&.to_i
|
11
|
+
|
12
|
+
# Only present if rate limit exceeded
|
13
|
+
@retry_after_seconds = headers["Retry-After"]&.to_i
|
14
|
+
end
|
15
|
+
|
16
|
+
def reset_at
|
17
|
+
return if reset_timestamp.nil?
|
18
|
+
Time.at(reset_timestamp).utc
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
"<RateLimit"\
|
23
|
+
" reset_at='#{reset_at.iso8601}'"\
|
24
|
+
" retry_after_seconds=#{retry_after_seconds}"\
|
25
|
+
" total=#{total}"\
|
26
|
+
" remaining=#{remaining}"\
|
27
|
+
">"
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
attr_reader :reset_timestamp
|
33
|
+
end
|
34
|
+
end
|
data/lib/remove_bg/result.rb
CHANGED
@@ -1,18 +1,21 @@
|
|
1
1
|
require "fileutils"
|
2
|
+
require "forwardable"
|
2
3
|
require "zip"
|
3
4
|
require_relative "error"
|
4
5
|
require_relative "image_composer"
|
5
6
|
|
6
7
|
module RemoveBg
|
7
8
|
class Result
|
8
|
-
|
9
|
+
extend ::Forwardable
|
9
10
|
|
10
|
-
|
11
|
+
attr_reader :metadata, :rate_limit
|
12
|
+
|
13
|
+
def_delegators :metadata, :type, :width, :height, :credits_charged
|
14
|
+
|
15
|
+
def initialize(download:, metadata:, rate_limit:)
|
11
16
|
@download = download
|
12
|
-
@
|
13
|
-
@
|
14
|
-
@height = height
|
15
|
-
@credits_charged = credits_charged
|
17
|
+
@metadata = metadata
|
18
|
+
@rate_limit = rate_limit
|
16
19
|
end
|
17
20
|
|
18
21
|
def save(file_path, overwrite: false)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative "api"
|
2
|
+
|
3
|
+
module RemoveBg
|
4
|
+
class ResultMetadata
|
5
|
+
attr_reader :type, :width, :height, :credits_charged
|
6
|
+
|
7
|
+
def initialize(headers)
|
8
|
+
@type = headers["X-Type"]
|
9
|
+
@width = headers["X-Width"]&.to_i
|
10
|
+
@height = headers["X-Height"]&.to_i
|
11
|
+
@credits_charged = headers["X-Credits-Charged"]&.to_f
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/remove_bg/version.rb
CHANGED
data/remove_bg.gemspec
CHANGED
@@ -27,8 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_dependency "image_processing", ">= 1.9", "< 2"
|
28
28
|
spec.add_dependency "rubyzip", ">= 2.0", "< 3"
|
29
29
|
|
30
|
-
spec.add_development_dependency "
|
31
|
-
spec.add_development_dependency "bundler", "~> 1.17"
|
30
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
32
31
|
spec.add_development_dependency "dotenv"
|
33
32
|
spec.add_development_dependency "pry"
|
34
33
|
spec.add_development_dependency "rake"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: remove_bg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oliver Peate
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-05-
|
11
|
+
date: 2020-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -70,34 +70,20 @@ dependencies:
|
|
70
70
|
- - "<"
|
71
71
|
- !ruby/object:Gem::Version
|
72
72
|
version: '3'
|
73
|
-
- !ruby/object:Gem::Dependency
|
74
|
-
name: appraisal
|
75
|
-
requirement: !ruby/object:Gem::Requirement
|
76
|
-
requirements:
|
77
|
-
- - ">="
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
version: '0'
|
80
|
-
type: :development
|
81
|
-
prerelease: false
|
82
|
-
version_requirements: !ruby/object:Gem::Requirement
|
83
|
-
requirements:
|
84
|
-
- - ">="
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version: '0'
|
87
73
|
- !ruby/object:Gem::Dependency
|
88
74
|
name: bundler
|
89
75
|
requirement: !ruby/object:Gem::Requirement
|
90
76
|
requirements:
|
91
77
|
- - "~>"
|
92
78
|
- !ruby/object:Gem::Version
|
93
|
-
version: '
|
79
|
+
version: '2.0'
|
94
80
|
type: :development
|
95
81
|
prerelease: false
|
96
82
|
version_requirements: !ruby/object:Gem::Requirement
|
97
83
|
requirements:
|
98
84
|
- - "~>"
|
99
85
|
- !ruby/object:Gem::Version
|
100
|
-
version: '
|
86
|
+
version: '2.0'
|
101
87
|
- !ruby/object:Gem::Dependency
|
102
88
|
name: dotenv
|
103
89
|
requirement: !ruby/object:Gem::Requirement
|
@@ -244,8 +230,10 @@ files:
|
|
244
230
|
- lib/remove_bg/error.rb
|
245
231
|
- lib/remove_bg/http_connection.rb
|
246
232
|
- lib/remove_bg/image_composer.rb
|
233
|
+
- lib/remove_bg/rate_limit_info.rb
|
247
234
|
- lib/remove_bg/request_options.rb
|
248
235
|
- lib/remove_bg/result.rb
|
236
|
+
- lib/remove_bg/result_metadata.rb
|
249
237
|
- lib/remove_bg/upload.rb
|
250
238
|
- lib/remove_bg/url_validator.rb
|
251
239
|
- lib/remove_bg/version.rb
|
@@ -272,7 +260,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
272
260
|
- !ruby/object:Gem::Version
|
273
261
|
version: '0'
|
274
262
|
requirements: []
|
275
|
-
rubygems_version: 3.
|
263
|
+
rubygems_version: 3.1.2
|
276
264
|
signing_key:
|
277
265
|
specification_version: 4
|
278
266
|
summary: Remove image background - 100% automatically
|