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 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