jbr 3.7.1 → 3.7.2

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: 28dde29d20aa9063e6e24e2226d81bf69ec7593ba99efd8a6f335d9fd83c8a10
4
- data.tar.gz: 106b0db3001c4aa10c6ef449d4204c6ad2e4574494b6033e7eadf1d13f3ccc59
3
+ metadata.gz: e017275cf5a3a41647f3817608327ddf8fa909c2fdf25e1f8c2a43ee1ad3b044
4
+ data.tar.gz: 1d01c835b75bd16cd21b8d4e658644520cc065c0659b1f394f105e02775b8f69
5
5
  SHA512:
6
- metadata.gz: 49a59576a7951bc00a29f4ec861576be2e28e448e53c1be2911dd094ebea9a7715a5e98eb34a2d208538ee63a8bd83b402f71b461e390d38aeb7a8885b816bd1
7
- data.tar.gz: d20c5ee0c9ddb0927649b884c45f84b7d7e97e315c54a2fd29c779a1b51c3f3691b5417d79e2dc4297d86f4795966703eb3462794ad0f867a0392cc9e9e4411d
6
+ metadata.gz: 89e55dd309b839918c67d79ee4c761d28cacb3f2c0dba30daa996354b0a22c4436aa52928dbfb7208df62609073157f77e42f7349943f4f58a2910dea1f43f00
7
+ data.tar.gz: 2cd3bf9d534e4fbb349debe3643aad4a62982e5780e27e558214594ffe9d536413bc5e8d837976d832422011b5da9be146bd9998492f6c33d99011274c213ef5
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [3.7.2] - 2026-08-17
2
+
3
+ - [Change] Jobber's token endpoint answers in prose, so that is all this reads. 3.7.1 kept a
4
+ branch for the OAuth 2 `invalid_grant` in a JSON body, guarded by a rescue for a body that
5
+ would not parse — and every failure body Jobber has ever been seen to send is prose, so the
6
+ rescue was the path and the branch it protected had never once been taken. Both are gone
7
+
1
8
  ## [3.7.1] - 2026-08-17
2
9
 
3
10
  - [Fix] A refresh token Jobber will not take gives the credentials up, as it always should
data/README.md CHANGED
@@ -67,11 +67,11 @@ Revoke credentials:
67
67
  oauth.delete
68
68
  ```
69
69
 
70
- Credentials go bad only when Jobber says so of the grant itself: the `invalid_grant` it names,
71
- or the 401 it answers a refresh token it will not take. Either sets `invalid_at` and answers
72
- queries with nothing. Anything else that goes wrong raises `Jbr::Error` instead a 500, a rate
73
- limit, and the 401 Jobber answers an app whose own client id and secret are wrong, which is
74
- every account's grant at once rather than this one's:
70
+ Credentials go bad only when Jobber says so of the grant itself `The provided refresh token
71
+ is not valid.` which sets `invalid_at` and answers queries with nothing. Anything else that
72
+ goes wrong raises `Jbr::Error` instead: a 500, a rate limit, and the 401 Jobber answers an app
73
+ whose own client id and secret are wrong, which is every account's grant at once rather than
74
+ this one's:
75
75
 
76
76
  ```ruby
77
77
  oauth.invalid_at # => 2026-08-13 11:02:41, or nil while the credentials are good
data/lib/jbr/token.rb CHANGED
@@ -4,12 +4,10 @@ module Jbr
4
4
  # Where a grant is exchanged.
5
5
  URL = 'https://api.getjobber.com/api/oauth/token'
6
6
 
7
- # What Jobber calls a grant that is no good, in the OAuth 2 word for it.
8
- REFUSAL = 'invalid_grant'
9
-
10
- # And what it calls one in the prose it answers a refresh token with instead. Specific to
11
- # the token rather than to the app, which is the whole reason for reading the body.
12
- REFUSAL_TEXT = /refresh token is not valid/
7
+ # What Jobber says of a grant it will not take, in the prose it answers with. About the
8
+ # token rather than about the app, which is what tells it from the 401 a wrong client id and
9
+ # secret get — and that one is every account at once rather than this one.
10
+ REFUSAL = /refresh token is not valid/
13
11
 
14
12
  # Trade a grant for credentials.
15
13
  # @param params [Hash] the grant, and the app making the exchange.
@@ -18,7 +16,7 @@ module Jbr
18
16
  # @return [Hash] the tokens, and the moment the access one expires.
19
17
  def self.post(params = {})
20
18
  response = Net::HTTP.post_form URI(URL), params
21
- raise Refused, response.body if refused? response
19
+ raise Refused, response.body if REFUSAL.match? response.body
22
20
  raise Error, response.body unless response.is_a? Net::HTTPSuccess
23
21
 
24
22
  output = JSON.parse response.body
@@ -26,22 +24,5 @@ module Jbr
26
24
  expires_at: (Time.now + output.fetch('expires_in', 3600).to_i),
27
25
  }
28
26
  end
29
-
30
- # Refused where Jobber turns the grant down rather than failing to answer about it: it names
31
- # the word, or it names the token. Never the status on its own — Jobber answers 401 to a
32
- # refresh token it will not take and 401 to an app whose own credentials are wrong, and
33
- # acting on the second as though it were the first would disconnect every account at once.
34
- def self.refused?(response)
35
- return false if response.is_a? Net::HTTPSuccess
36
-
37
- coded_refusal?(response.body) || REFUSAL_TEXT.match?(response.body.to_s)
38
- end
39
-
40
- def self.coded_refusal?(body)
41
- JSON.parse(body)['error'] == REFUSAL
42
- rescue JSON::ParserError
43
- false
44
- end
45
- private_class_method :refused?, :coded_refusal?
46
27
  end
47
28
  end
data/lib/jbr/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # A Ruby client for the Jobber API.
2
2
  module Jbr
3
3
  # The version of this gem.
4
- VERSION = '3.7.1'
4
+ VERSION = '3.7.2'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jbr
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.7.1
4
+ version: 3.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claudio Baccigalupo