remove_bg 1.4.0 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c58154a3e3edc19ed8562c66f603a4965512814787e6b3d62907f7c931fec111
4
- data.tar.gz: b2c773dc3f11983a95b510b7a65ce8060d318d37b30e0fec4aeaf73552cbdfa0
3
+ metadata.gz: 728a996008009c54dc10d72f0b0db353b1156182a8379c51ed0cf5f9fbe4b27e
4
+ data.tar.gz: 991a7201af58af739e73af965d082b43a0427d79878e0db2f17d13c3ac575053
5
5
  SHA512:
6
- metadata.gz: f3ec05a4b3e9f55676d1dd50da5e5f148a532e15c7fce09aa65429df243769e9de47271c31567f1e90f4b16c20bbc653618dbd2b9dffe7bd6b8500dc421eb1ef
7
- data.tar.gz: 3c2fbb46e300903114df2b0fcca3b6fecdeb0dd3844aace5d60de88cf88794167531456455c52b935f9626f21b1e8cf2476cf4454f95bf6d56c702cc0f49fdd7
6
+ metadata.gz: 2800e1a449e12e3168c7e15d9fd85b8424434ff568821600464a05d6448529e22514ab1e80cdd7c76c7a6ab91e45db01f99b7a7e7dab617d00b797f6788aa872
7
+ data.tar.gz: 556b0ded824694cffb639cab278eb00ffea8df314c5beee20a2565528671d8548fb856a3d14a52af73c5147f54d016b457268101046ce6c75647fb0a6b606c61
@@ -11,7 +11,10 @@ base_job: &base_job
11
11
 
12
12
  - run:
13
13
  name: install dependencies
14
- command: bundle install --jobs=4 --retry=3 --path vendor/bundle
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
@@ -18,3 +18,5 @@ test-results
18
18
  gemfiles/*.gemfile.lock
19
19
 
20
20
  examples/output
21
+
22
+ .ruby-version
@@ -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
@@ -1,3 +1,7 @@
1
1
  source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
+
5
+ group :development do
6
+ gem "appraisal", git: "https://github.com/thoughtbot/appraisal.git", ref: "5868643"
7
+ end
@@ -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.0)
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 (~> 1.17)
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.17.3
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
@@ -4,4 +4,8 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "faraday", "~> 0.15.0"
6
6
 
7
+ group :development do
8
+ gem "appraisal", git: "https://github.com/thoughtbot/appraisal.git", ref: "5868643"
9
+ end
10
+
7
11
  gemspec path: "../"
@@ -4,4 +4,8 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "faraday", "~> 0.16.0"
6
6
 
7
+ group :development do
8
+ gem "appraisal", git: "https://github.com/thoughtbot/appraisal.git", ref: "5868643"
9
+ end
10
+
7
11
  gemspec path: "../"
@@ -4,4 +4,8 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "faraday", "~> 0.17.0"
6
6
 
7
+ group :development do
8
+ gem "appraisal", git: "https://github.com/thoughtbot/appraisal.git", ref: "5868643"
9
+ end
10
+
7
11
  gemspec path: "../"
@@ -4,4 +4,8 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "faraday", "~> 1.0"
6
6
 
7
+ group :development do
8
+ gem "appraisal", git: "https://github.com/thoughtbot/appraisal.git", ref: "5868643"
9
+ end
10
+
7
11
  gemspec path: "../"
@@ -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
@@ -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
- type: headers[HEADER_TYPE],
102
- width: headers[HEADER_WIDTH]&.to_i,
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
- Tempfile.new(["composed", ".png"]).tap do |file|
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 ||= Tempfile.new(["color", ".jpg"])
27
+ @color_file ||= binary_tempfile(["color", ".jpg"])
29
28
  end
30
29
 
31
30
  def alpha_file
32
- @alpha_file ||= Tempfile.new(["alpha", ".png"])
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
@@ -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
@@ -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
- attr_reader :type, :width, :height, :credits_charged
9
+ extend ::Forwardable
9
10
 
10
- def initialize(download:, type:, width:, height:, credits_charged:)
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
- @type = type
13
- @width = width
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
@@ -1,3 +1,3 @@
1
1
  module RemoveBg
2
- VERSION = "1.4.0"
2
+ VERSION = "1.4.1"
3
3
  end
@@ -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 "appraisal"
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.0
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-20 00:00:00.000000000 Z
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: '1.17'
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: '1.17'
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.0.3
263
+ rubygems_version: 3.1.2
276
264
  signing_key:
277
265
  specification_version: 4
278
266
  summary: Remove image background - 100% automatically