procore 0.8.8 → 1.1.3
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 +5 -5
- data/.rubocop.yml +9 -5
- data/.travis.yml +11 -16
- data/CHANGELOG.md +87 -1
- data/README.md +60 -10
- data/lib/procore/auth/access_token_credentials.rb +11 -0
- data/lib/procore/auth/stores/redis.rb +1 -1
- data/lib/procore/client.rb +49 -29
- data/lib/procore/configuration.rb +10 -0
- data/lib/procore/defaults.rb +5 -1
- data/lib/procore/requestable.rb +30 -17
- data/lib/procore/response.rb +3 -4
- data/lib/procore/version.rb +1 -1
- data/procore-1.1.1.gem +0 -0
- data/procore.gemspec +2 -0
- metadata +33 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: dd1eb304ce63c6fc2163b5dc0fbb5e98f02e2172
|
|
4
|
+
data.tar.gz: 7f616999b991a439f252ecee53a73c2e63d3fda0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3b812a82954028fb21d708b42ecfe509ff735a11c29bb01eecf3d1952e5a5b6d3b246b8187d887254bbd9b6c2057dc96890580a92952e9e9c4f30e75a813ca2e
|
|
7
|
+
data.tar.gz: 81a4a77d7b1af2a17dc5cea4400376372d84fbf533b20ae6c02f12f12a197d06c14172bc8659fa1b6d9b7592bbb247a484d2361d9646b5afcd33dda0e34c5b75
|
data/.rubocop.yml
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
require:
|
|
2
|
+
- rubocop-rails
|
|
3
|
+
- rubocop-performance
|
|
4
|
+
|
|
1
5
|
AllCops:
|
|
2
|
-
TargetRubyVersion: 2.
|
|
6
|
+
TargetRubyVersion: 2.5
|
|
3
7
|
Include:
|
|
4
8
|
- '**/Rakefile'
|
|
5
9
|
- '**/config.ru'
|
|
@@ -305,7 +309,7 @@ Style/PerlBackrefs:
|
|
|
305
309
|
Naming/PredicateName:
|
|
306
310
|
Description: 'Check the names of predicate methods.'
|
|
307
311
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#bool-methods-qmark'
|
|
308
|
-
|
|
312
|
+
ForbiddenPrefixes:
|
|
309
313
|
- is_
|
|
310
314
|
Exclude:
|
|
311
315
|
- spec/**/*
|
|
@@ -437,7 +441,7 @@ Style/RedundantBegin:
|
|
|
437
441
|
|
|
438
442
|
# Layout
|
|
439
443
|
|
|
440
|
-
Layout/
|
|
444
|
+
Layout/ParameterAlignment:
|
|
441
445
|
Description: 'Here we check if the parameters on a multi-line method call or definition are aligned.'
|
|
442
446
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-double-indent'
|
|
443
447
|
Enabled: false
|
|
@@ -505,7 +509,7 @@ Lint/DeprecatedClassMethods:
|
|
|
505
509
|
Description: 'Check for deprecated class method calls.'
|
|
506
510
|
Enabled: false
|
|
507
511
|
|
|
508
|
-
Lint/
|
|
512
|
+
Lint/DuplicateHashKey:
|
|
509
513
|
Description: 'Check for duplicate keys in hash literals.'
|
|
510
514
|
Enabled: false
|
|
511
515
|
|
|
@@ -521,7 +525,7 @@ Lint/FormatParameterMismatch:
|
|
|
521
525
|
Description: 'The number of parameters to format/sprint must match the fields.'
|
|
522
526
|
Enabled: false
|
|
523
527
|
|
|
524
|
-
Lint/
|
|
528
|
+
Lint/SuppressedException:
|
|
525
529
|
Description: "Don't suppress exception."
|
|
526
530
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#dont-hide-exceptions'
|
|
527
531
|
Enabled: false
|
data/.travis.yml
CHANGED
|
@@ -1,30 +1,25 @@
|
|
|
1
1
|
language: ruby
|
|
2
2
|
rvm:
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
- 2.3
|
|
4
|
+
- 2.4
|
|
5
|
+
- 2.5
|
|
6
|
+
- 2.6
|
|
8
7
|
services:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
- redis-server
|
|
9
|
+
- memcached
|
|
12
10
|
before_install:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
- gem update --system
|
|
12
|
+
- gem install bundler
|
|
16
13
|
cache: bundler
|
|
17
|
-
|
|
18
14
|
script: bundle exec rake
|
|
19
|
-
|
|
20
15
|
deploy:
|
|
21
16
|
provider: rubygems
|
|
22
17
|
api_key:
|
|
23
|
-
secure:
|
|
24
|
-
gem:
|
|
18
|
+
secure: LC+5qDeaqBtA8IIDt0yHNYsTA/KEs7IK/hESF2V2f4bhmMapifEVSjikoZVE1lTe0R2+CyO+5mWHloFeTLayTchpZhW3yfduei3l2tktZOH9UCsXIQZKveSZlCMQ+XOn65Gstbd/5krh9+axKZswgM5YgBhjXNRgjL+yOGh2kXN0exk5nBvIBFxSCQdwqGiBDcrtgJ4eWrlPgofXszMFb3ogNQcIuUcKmAOC0j/fNag4qQV0jnp3zHDuOjrsARPJn4w6RMqSLpFVUYpJw3tE94GDW5kILHr7taTPj12PeYNbYjW7kRSgMYbQlIWUKLeyMp+vw3kNqd3Ysat+M+Mrf3z2KRKR5w62IJnCq758uerCdUo5v/vsWHYFcJvZWLrvsPSk+xQWysAqRdkun7ZBCK/FLR75S6Vkm0DBnbqd/yYp6MP9Vbi77gIZpWMXANfdk1aWGVlPNpskYeWyqPjwZX1nYybJQIIpZfX21F2WPrNA9r/cj1KYjb8vKopMEdn9GP9xMeUXXu85K+ZVPqSD/AblrLHyD2x7cES/i4+XcQSaKUOSLxTUqemAiDRBahDCehPOOeLHnu/rUzgQr1gzQL0YcLNgHovmIdstljBys62JC4gy376cNawiSW4ZPMHWg6PewqQ6Ozg4Lkytx06bBwOos55dFgI4k0T4H0/6QiE=
|
|
19
|
+
gem: ruby-sdk
|
|
25
20
|
on:
|
|
26
21
|
tags: true
|
|
27
22
|
repo: procore/ruby-sdk
|
|
28
|
-
|
|
23
|
+
skip_cleanup: 'true'
|
|
29
24
|
notifications:
|
|
30
25
|
email: false
|
data/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,90 @@
|
|
|
1
|
-
##
|
|
1
|
+
## 1.1.3 (Jun 11, 2021)
|
|
2
|
+
|
|
3
|
+
* Add Procore-Sdk-Language header to all requests
|
|
4
|
+
|
|
5
|
+
PR #45 - https://github.com/procore/ruby-sdk/pull/45
|
|
6
|
+
|
|
7
|
+
*Benjamin Ross*
|
|
8
|
+
|
|
9
|
+
* Remove Redis.exists warning
|
|
10
|
+
|
|
11
|
+
PR #46 - https://github.com/procore/ruby-sdk/pull/46
|
|
12
|
+
|
|
13
|
+
*claudioprocore*
|
|
14
|
+
|
|
15
|
+
## 1.1.2 (Jun 4, 2021)
|
|
16
|
+
|
|
17
|
+
* Add Procore-Sdk-Version header to all requests
|
|
18
|
+
|
|
19
|
+
PR #44 - https://github.com/procore/ruby-sdk/pull/44
|
|
20
|
+
|
|
21
|
+
*Benjamin Ross*
|
|
22
|
+
|
|
23
|
+
## 1.1.1 (May 5, 2021)
|
|
24
|
+
|
|
25
|
+
* Change default host to 'api.procore.com'.
|
|
26
|
+
|
|
27
|
+
PR #42 - https://github.com/procore/ruby-sdk/pull/42
|
|
28
|
+
|
|
29
|
+
*Nate Baer*
|
|
30
|
+
|
|
31
|
+
## 1.1.0 (March 11, 2021)
|
|
32
|
+
|
|
33
|
+
* Allow tokens to be revoked and manually refreshed.
|
|
34
|
+
|
|
35
|
+
PR #39 - https://github.com/procore/ruby-sdk/pull/39
|
|
36
|
+
|
|
37
|
+
*Nate Baer*
|
|
38
|
+
|
|
39
|
+
## 1.0.0 (January 5, 2021)
|
|
40
|
+
|
|
41
|
+
* Adds support for API versioning
|
|
42
|
+
|
|
43
|
+
*Nate Baer*
|
|
44
|
+
|
|
45
|
+
### Upgrading
|
|
46
|
+
|
|
47
|
+
As of v1.0.0, this gem now defaults to making requests against Procore's new
|
|
48
|
+
Rest v1.0 resources, instead of the now deprecated `/vapid` namespace. Example:
|
|
49
|
+
|
|
50
|
+
```ruby
|
|
51
|
+
# Previously makes a request to
|
|
52
|
+
client.get("me")
|
|
53
|
+
=> app.procore.com/vapid/me
|
|
54
|
+
|
|
55
|
+
# In 1.0.0
|
|
56
|
+
client.get("me")
|
|
57
|
+
=> app.procore.com/rest/v1.0/me
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
To keep the legacy behavior, set the new `default_version` configuration option.
|
|
61
|
+
Note, that Rest v1.0 is a superset of the Vapid Api - there are no breaking
|
|
62
|
+
changes. The Vapid API will be decommissioned in December 2021.
|
|
63
|
+
|
|
64
|
+
[Read more here](https://developers.procore.com/documentation/vapid-deprecation)
|
|
65
|
+
|
|
66
|
+
```ruby
|
|
67
|
+
Procore.configure do |config|
|
|
68
|
+
...
|
|
69
|
+
# Defaults to "v1.0"
|
|
70
|
+
config.default_version = "vapid"
|
|
71
|
+
...
|
|
72
|
+
end
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
All the request methods (`get`, `post`, `patch`, `put`, `delete`, `sync`) now
|
|
76
|
+
accept an optional version parameter to specify the version at request time.
|
|
77
|
+
|
|
78
|
+
```ruby
|
|
79
|
+
client.get("me")
|
|
80
|
+
=> https://app.procore.com/rest/v1.0/me
|
|
81
|
+
|
|
82
|
+
client.get("me", version: "v1.1")
|
|
83
|
+
=> https://app.procore.com/rest/v1.1/me
|
|
84
|
+
|
|
85
|
+
client.get("me", version: "vapid")
|
|
86
|
+
=> https://app.procore.com/vapid/me
|
|
87
|
+
```
|
|
2
88
|
|
|
3
89
|
## 0.8.8 (October 17, 2019)
|
|
4
90
|
|
data/README.md
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
#### Table of Contents
|
|
6
6
|
- [Installation](#installation)
|
|
7
|
+
- [1.0.0 Release](#100-release)
|
|
7
8
|
- [Making Requests](#making-requests)
|
|
8
9
|
- [Usage](#usage)
|
|
9
10
|
- [Error Handling](#error-handling)
|
|
@@ -30,6 +31,11 @@ Add this line to your application's Gemfile:
|
|
|
30
31
|
gem "procore"
|
|
31
32
|
```
|
|
32
33
|
|
|
34
|
+
## 1.0.0 Release
|
|
35
|
+
|
|
36
|
+
v1.0.0 was released on January 5, 2021, and adds support the new Rest v1.0 API.
|
|
37
|
+
See the CHANGELOG for upgrade instructions.
|
|
38
|
+
|
|
33
39
|
## Making Requests
|
|
34
40
|
|
|
35
41
|
At the core of the gem is the `Client` class. Clients are initialized with a
|
|
@@ -41,20 +47,30 @@ Stores automatically manage tokens for you - refreshing, revoking and storage
|
|
|
41
47
|
are abstracted away to make your code as simple as possible. There are several
|
|
42
48
|
different [types of stores](#stores) available to you.
|
|
43
49
|
|
|
44
|
-
The Client class exposes `#get`, `#post`, `#put`, `#patch`,
|
|
50
|
+
The Client class exposes `#get`, `#post`, `#put`, `#patch`, `#sync` and
|
|
45
51
|
`#delete` methods to you.
|
|
46
52
|
|
|
47
53
|
```ruby
|
|
48
|
-
get(path, query: {})
|
|
49
|
-
post(path, body: {}, options: {})
|
|
50
|
-
put(path, body: {}, options: {})
|
|
51
|
-
patch(path, body: {}, options: {})
|
|
52
|
-
delete(path, query: {})
|
|
53
|
-
sync(path, body: {}, options: {})
|
|
54
|
+
get(path, version: "", query: {})
|
|
55
|
+
post(path, version: "", body: {}, options: {})
|
|
56
|
+
put(path, version: "", body: {}, options: {})
|
|
57
|
+
patch(path, version: "", body: {}, options: {})
|
|
58
|
+
delete(path, version: "", query: {})
|
|
59
|
+
sync(path, version: "", body: {}, options: {})
|
|
54
60
|
```
|
|
55
61
|
|
|
56
|
-
All paths are relative
|
|
57
|
-
`
|
|
62
|
+
All paths are relative, the gem will handle expanding them. An API version may
|
|
63
|
+
be specified in the `version:` argument, or the default version is used. The
|
|
64
|
+
default version is `v1.0` unless otherwise configured.
|
|
65
|
+
|
|
66
|
+
| Example | Requested URL |
|
|
67
|
+
| --- | --- |
|
|
68
|
+
| `client.get("me")` | `https://api.procore.com/rest/v1.0/me` |
|
|
69
|
+
| `client.get("me", version: "v1.1")` | `https://api.procore.com/rest/v1.1/me` |
|
|
70
|
+
| `client.get("me", version: "vapid")` | `https://api.procore.com/vapid/me` |
|
|
71
|
+
|
|
72
|
+
In addition to the settings above, you will need to set `company_id` in the request
|
|
73
|
+
options to work with [Multiple Procore Zones (MPZ)](https://developers.procore.com/documentation/tutorial-mpz).
|
|
58
74
|
|
|
59
75
|
Example Usage:
|
|
60
76
|
|
|
@@ -70,6 +86,24 @@ client = Procore::Client.new(
|
|
|
70
86
|
companies = client.get("companies")
|
|
71
87
|
|
|
72
88
|
companies.first[:name] #=> "Procore Company 1"
|
|
89
|
+
|
|
90
|
+
# Get a company's projects (note the company_id value in options)
|
|
91
|
+
projects = client.get("projects", query: {company_id: <company_id>}, options: {company_id: <company_id>})
|
|
92
|
+
|
|
93
|
+
projects.first[:name] #=> "Project 1"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
To use Procore's older API Vapid by default, the default version can be set in
|
|
97
|
+
either the Gem's [configuration](https://github.com/procore/ruby-sdk#configuration)
|
|
98
|
+
or the client's `options` hash:
|
|
99
|
+
|
|
100
|
+
```ruby
|
|
101
|
+
client = Procore::Client.new(
|
|
102
|
+
...
|
|
103
|
+
options {
|
|
104
|
+
default_version: "vapid"
|
|
105
|
+
}
|
|
106
|
+
)
|
|
73
107
|
```
|
|
74
108
|
|
|
75
109
|
## Usage
|
|
@@ -115,6 +149,18 @@ client = Procore::Client.new(
|
|
|
115
149
|
client.get("me")
|
|
116
150
|
```
|
|
117
151
|
|
|
152
|
+
Expired tokens will automatically be refreshed, but can also be refreshed manually:
|
|
153
|
+
|
|
154
|
+
```ruby
|
|
155
|
+
client.refresh
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Tokens may also be manually revoked, forcing the client to refresh its token on the next request:
|
|
159
|
+
|
|
160
|
+
```ruby
|
|
161
|
+
client.revoke
|
|
162
|
+
```
|
|
163
|
+
|
|
118
164
|
## Error Handling
|
|
119
165
|
|
|
120
166
|
The Procore Gem raises errors whenever a request returns a non `2xx` response.
|
|
@@ -317,13 +363,17 @@ Procore.configure do |config|
|
|
|
317
363
|
# Base API host name. Alter this depending on your environment - in a
|
|
318
364
|
# staging or test environment you may want to point this at a sandbox
|
|
319
365
|
# instead of production.
|
|
320
|
-
config.host = ENV.fetch("PROCORE_BASE_API_PATH", "https://
|
|
366
|
+
config.host = ENV.fetch("PROCORE_BASE_API_PATH", "https://api.procore.com")
|
|
321
367
|
|
|
322
368
|
# When using #sync action, sets the default batch size to use for chunking
|
|
323
369
|
# up a request body. Example: if the size is set to 500, and 2,000 updates
|
|
324
370
|
# are desired, 4 requests will be made. Note, the maximum size is 1000.
|
|
325
371
|
config.default_batch_size = 500
|
|
326
372
|
|
|
373
|
+
# The default API version to use if none is specified in the request.
|
|
374
|
+
# Should be either "v1.0" (recommended) or "vapid" (legacy).
|
|
375
|
+
config.default_version = "v1.0"
|
|
376
|
+
|
|
327
377
|
# Integer: Number of times to retry a failed API call. Reasons an API call
|
|
328
378
|
# could potentially fail:
|
|
329
379
|
# 1. Service is briefly down or unreachable
|
|
@@ -32,6 +32,17 @@ module Procore
|
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
+
def revoke(token:)
|
|
36
|
+
request = {
|
|
37
|
+
client_id: @client_id,
|
|
38
|
+
client_secret: @client_secret,
|
|
39
|
+
token: token.access_token,
|
|
40
|
+
}
|
|
41
|
+
client.request(:post, "/oauth/revoke", body: request)
|
|
42
|
+
rescue RestClient::ExceptionWithResponse
|
|
43
|
+
raise OAuthError.new(e.description, response: e.response)
|
|
44
|
+
end
|
|
45
|
+
|
|
35
46
|
private
|
|
36
47
|
|
|
37
48
|
def client
|
data/lib/procore/client.rb
CHANGED
|
@@ -38,23 +38,56 @@ module Procore
|
|
|
38
38
|
@store = store
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
# @raise [OAuthError] if a token cannot be refreshed.
|
|
42
|
+
def refresh
|
|
43
|
+
token = fetch_token
|
|
42
44
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
begin
|
|
46
|
+
new_token = @credentials.refresh(
|
|
47
|
+
token: token.access_token,
|
|
48
|
+
refresh: token.refresh_token,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
Util.log_info("Token Refresh Successful", store: store)
|
|
52
|
+
store.save(new_token)
|
|
53
|
+
rescue RuntimeError
|
|
54
|
+
Util.log_error("Token Refresh Failed", store: store)
|
|
55
|
+
raise Procore::OAuthError.new(
|
|
56
|
+
"Unable to refresh the access token. Perhaps the Procore API is " \
|
|
57
|
+
"down or your access token store is misconfigured. Either " \
|
|
58
|
+
"way, you should clear the store and prompt the user to sign in " \
|
|
59
|
+
"again.",
|
|
60
|
+
)
|
|
61
|
+
end
|
|
45
62
|
end
|
|
46
63
|
|
|
47
|
-
|
|
48
|
-
|
|
64
|
+
# @raise [OAuthError] if a token cannot be revoked.
|
|
65
|
+
def revoke
|
|
66
|
+
token = fetch_token
|
|
67
|
+
|
|
68
|
+
begin
|
|
69
|
+
@credentials.revoke(token: token)
|
|
70
|
+
Util.log_info("Token Revocation Successful", store: store)
|
|
71
|
+
rescue RuntimeError
|
|
72
|
+
Util.log_error("Token Revocation Failed", store: store)
|
|
73
|
+
raise Procore::OAuthError.new(
|
|
74
|
+
"Unable to revoke the access token. Perhaps the Procore API is " \
|
|
75
|
+
"down or your access token store is misconfigured. Either " \
|
|
76
|
+
"way, you should clear the store and prompt the user to sign in " \
|
|
77
|
+
"again.",
|
|
78
|
+
)
|
|
79
|
+
end
|
|
49
80
|
end
|
|
50
81
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
token = store.fetch
|
|
82
|
+
private
|
|
83
|
+
|
|
84
|
+
def base_api_path
|
|
85
|
+
"#{options[:host]}"
|
|
86
|
+
end
|
|
57
87
|
|
|
88
|
+
# @raise [OAuthError] if the store does not have a token stored.
|
|
89
|
+
def fetch_token
|
|
90
|
+
token = store.fetch
|
|
58
91
|
if token.nil? || token.invalid?
|
|
59
92
|
raise Procore::MissingTokenError.new(
|
|
60
93
|
"Unable to retreive an access token from the store. Double check " \
|
|
@@ -62,28 +95,15 @@ module Procore
|
|
|
62
95
|
"before attempting to make API requests",
|
|
63
96
|
)
|
|
64
97
|
end
|
|
98
|
+
token
|
|
99
|
+
end
|
|
65
100
|
|
|
101
|
+
def access_token
|
|
102
|
+
token = fetch_token
|
|
66
103
|
if token.expired?
|
|
67
104
|
Util.log_info("Token Expired", store: store)
|
|
68
|
-
|
|
69
|
-
token = @credentials.refresh(
|
|
70
|
-
token: token.access_token,
|
|
71
|
-
refresh: token.refresh_token,
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
Util.log_info("Token Refresh Successful", store: store)
|
|
75
|
-
store.save(token)
|
|
76
|
-
rescue RuntimeError
|
|
77
|
-
Util.log_error("Token Refresh Failed", store: store)
|
|
78
|
-
raise Procore::OAuthError.new(
|
|
79
|
-
"Unable to refresh the access token. Perhaps the Procore API is " \
|
|
80
|
-
"down or the your access token store is misconfigured. Either " \
|
|
81
|
-
"way, you should clear the store and prompt the user to sign in " \
|
|
82
|
-
"again.",
|
|
83
|
-
)
|
|
84
|
-
end
|
|
105
|
+
refresh
|
|
85
106
|
end
|
|
86
|
-
|
|
87
107
|
token.access_token
|
|
88
108
|
end
|
|
89
109
|
end
|
|
@@ -32,6 +32,15 @@ module Procore
|
|
|
32
32
|
# @return [String]
|
|
33
33
|
attr_accessor :host
|
|
34
34
|
|
|
35
|
+
# @!attribute [rw] default_version
|
|
36
|
+
# @note defaults to Defaults::DEFAULT_VERSION
|
|
37
|
+
#
|
|
38
|
+
# The default API version to use if none is specified in the request.
|
|
39
|
+
# Should be either "v1.0" (recommended) or "vapid" (legacy).
|
|
40
|
+
#
|
|
41
|
+
# @return [String]
|
|
42
|
+
attr_accessor :default_version
|
|
43
|
+
|
|
35
44
|
# @!attribute [rw] logger
|
|
36
45
|
# @note defaults to nil
|
|
37
46
|
#
|
|
@@ -96,6 +105,7 @@ module Procore
|
|
|
96
105
|
@max_retries = 1
|
|
97
106
|
@timeout = 1.0
|
|
98
107
|
@user_agent = Procore::Defaults::USER_AGENT
|
|
108
|
+
@default_version = Procore::Defaults::DEFAULT_VERSION
|
|
99
109
|
end
|
|
100
110
|
end
|
|
101
111
|
end
|
data/lib/procore/defaults.rb
CHANGED
|
@@ -4,7 +4,7 @@ module Procore
|
|
|
4
4
|
# Specifies some sensible defaults for certain configurations + clients
|
|
5
5
|
class Defaults
|
|
6
6
|
# Default API endpoint
|
|
7
|
-
API_ENDPOINT = "https://
|
|
7
|
+
API_ENDPOINT = "https://api.procore.com".freeze
|
|
8
8
|
|
|
9
9
|
# Default User Agent header string
|
|
10
10
|
USER_AGENT = "Procore Ruby Gem #{Procore::VERSION}".freeze
|
|
@@ -12,10 +12,14 @@ module Procore
|
|
|
12
12
|
# Default size to use for batch requests
|
|
13
13
|
BATCH_SIZE = 500
|
|
14
14
|
|
|
15
|
+
# Default API version to use
|
|
16
|
+
DEFAULT_VERSION = "v1.0"
|
|
17
|
+
|
|
15
18
|
def self.client_options
|
|
16
19
|
{
|
|
17
20
|
host: Procore.configuration.host,
|
|
18
21
|
user_agent: Procore.configuration.user_agent,
|
|
22
|
+
default_version: Procore.configuration.default_version,
|
|
19
23
|
}
|
|
20
24
|
end
|
|
21
25
|
end
|
data/lib/procore/requestable.rb
CHANGED
|
@@ -19,6 +19,7 @@ module Procore
|
|
|
19
19
|
RestClient::ServerBrokeConnection,
|
|
20
20
|
].freeze
|
|
21
21
|
# @param path [String] URL path
|
|
22
|
+
# @param version [String] API version
|
|
22
23
|
# @param query [Hash] Query options to pass along with the request
|
|
23
24
|
# @option options [Hash] :company_id
|
|
24
25
|
#
|
|
@@ -26,8 +27,8 @@ module Procore
|
|
|
26
27
|
# client.get("my_open_items", query: { per_page: 5, filter: {} })
|
|
27
28
|
#
|
|
28
29
|
# @return [Response]
|
|
29
|
-
def get(path, query: {}, options: {})
|
|
30
|
-
full_path = full_path(path)
|
|
30
|
+
def get(path, version: nil, query: {}, options: {})
|
|
31
|
+
full_path = full_path(path, version)
|
|
31
32
|
|
|
32
33
|
Util.log_info(
|
|
33
34
|
"API Request Initiated",
|
|
@@ -47,6 +48,7 @@ module Procore
|
|
|
47
48
|
end
|
|
48
49
|
|
|
49
50
|
# @param path [String] URL path
|
|
51
|
+
# @param version [String] API version
|
|
50
52
|
# @param body [Hash] Body parameters to send with the request
|
|
51
53
|
# @param options [Hash] Extra request options
|
|
52
54
|
# @option options [String] :idempotency_token | :company_id
|
|
@@ -59,8 +61,8 @@ module Procore
|
|
|
59
61
|
# )
|
|
60
62
|
#
|
|
61
63
|
# @return [Response]
|
|
62
|
-
def post(path, body: {}, options: {})
|
|
63
|
-
full_path = full_path(path)
|
|
64
|
+
def post(path, version: nil, body: {}, options: {})
|
|
65
|
+
full_path = full_path(path, version)
|
|
64
66
|
|
|
65
67
|
Util.log_info(
|
|
66
68
|
"API Request Initiated",
|
|
@@ -81,6 +83,7 @@ module Procore
|
|
|
81
83
|
end
|
|
82
84
|
|
|
83
85
|
# @param path [String] URL path
|
|
86
|
+
# @param version [String] API version
|
|
84
87
|
# @param body [Hash] Body parameters to send with the request
|
|
85
88
|
# @param options [Hash] Extra request options
|
|
86
89
|
# @option options [String] :idempotency_token | :company_id
|
|
@@ -89,8 +92,8 @@ module Procore
|
|
|
89
92
|
# client.put("dashboards/1/users", body: [1,2,3], options: { company_id: 1 })
|
|
90
93
|
#
|
|
91
94
|
# @return [Response]
|
|
92
|
-
def put(path, body: {}, options: {})
|
|
93
|
-
full_path = full_path(path)
|
|
95
|
+
def put(path, version: nil, body: {}, options: {})
|
|
96
|
+
full_path = full_path(path, version)
|
|
94
97
|
|
|
95
98
|
Util.log_info(
|
|
96
99
|
"API Request Initiated",
|
|
@@ -111,6 +114,7 @@ module Procore
|
|
|
111
114
|
end
|
|
112
115
|
|
|
113
116
|
# @param path [String] URL path
|
|
117
|
+
# @param version [String] API version
|
|
114
118
|
# @param body [Hash] Body parameters to send with the request
|
|
115
119
|
# @param options [Hash] Extra request options
|
|
116
120
|
# @option options [String] :idempotency_token | :company_id
|
|
@@ -123,8 +127,8 @@ module Procore
|
|
|
123
127
|
# )
|
|
124
128
|
#
|
|
125
129
|
# @return [Response]
|
|
126
|
-
def patch(path, body: {}, options: {})
|
|
127
|
-
full_path = full_path(path)
|
|
130
|
+
def patch(path, version: nil, body: {}, options: {})
|
|
131
|
+
full_path = full_path(path, version)
|
|
128
132
|
|
|
129
133
|
Util.log_info(
|
|
130
134
|
"API Request Initiated",
|
|
@@ -145,6 +149,7 @@ module Procore
|
|
|
145
149
|
end
|
|
146
150
|
|
|
147
151
|
# @param path [String] URL path
|
|
152
|
+
# @param version [String] API version
|
|
148
153
|
# @param body [Hash] Body parameters to send with the request
|
|
149
154
|
# @param options [Hash] Extra request options
|
|
150
155
|
# @option options [String | Integer] :company_id | :batch_size
|
|
@@ -166,8 +171,8 @@ module Procore
|
|
|
166
171
|
# )
|
|
167
172
|
#
|
|
168
173
|
# @return [Response]
|
|
169
|
-
def sync(path, body: {}, options: {})
|
|
170
|
-
full_path = full_path(path)
|
|
174
|
+
def sync(path, version: nil, body: {}, options: {})
|
|
175
|
+
full_path = full_path(path, version)
|
|
171
176
|
|
|
172
177
|
batch_size = options[:batch_size] ||
|
|
173
178
|
Procore.configuration.default_batch_size
|
|
@@ -183,7 +188,7 @@ module Procore
|
|
|
183
188
|
batch_size: batch_size,
|
|
184
189
|
)
|
|
185
190
|
|
|
186
|
-
groups = body[:updates].
|
|
191
|
+
groups = body[:updates].each_slice(batch_size).to_a
|
|
187
192
|
|
|
188
193
|
responses = groups.map do |group|
|
|
189
194
|
batched_body = body.merge(updates: group)
|
|
@@ -206,11 +211,11 @@ module Procore
|
|
|
206
211
|
code: 200,
|
|
207
212
|
request: responses.last&.request,
|
|
208
213
|
request_body: body,
|
|
209
|
-
api_version: api_version,
|
|
210
214
|
)
|
|
211
215
|
end
|
|
212
216
|
|
|
213
217
|
# @param path [String] URL path
|
|
218
|
+
# @param version [String] API version
|
|
214
219
|
# @param query [Hash] Query options to pass along with the request
|
|
215
220
|
# @option options [String] :company_id
|
|
216
221
|
#
|
|
@@ -218,8 +223,8 @@ module Procore
|
|
|
218
223
|
# client.delete("users/1", query: {}, options: {})
|
|
219
224
|
#
|
|
220
225
|
# @return [Response]
|
|
221
|
-
def delete(path, query: {}, options: {})
|
|
222
|
-
full_path = full_path(path)
|
|
226
|
+
def delete(path, version: nil, query: {}, options: {})
|
|
227
|
+
full_path = full_path(path, version)
|
|
223
228
|
|
|
224
229
|
Util.log_info(
|
|
225
230
|
"API Request Initiated",
|
|
@@ -270,7 +275,6 @@ module Procore
|
|
|
270
275
|
code: result.code,
|
|
271
276
|
request: result.request,
|
|
272
277
|
request_body: request_body,
|
|
273
|
-
api_version: api_version
|
|
274
278
|
)
|
|
275
279
|
|
|
276
280
|
case result.code
|
|
@@ -339,6 +343,8 @@ module Procore
|
|
|
339
343
|
"Accepts" => "application/json",
|
|
340
344
|
"Authorization" => "Bearer #{access_token}",
|
|
341
345
|
"Content-Type" => "application/json",
|
|
346
|
+
"Procore-Sdk-Version" => Procore::VERSION,
|
|
347
|
+
"Procore-Sdk-Language" => "ruby",
|
|
342
348
|
"User-Agent" => Procore.configuration.user_agent,
|
|
343
349
|
}.tap do |headers|
|
|
344
350
|
if options[:idempotency_token]
|
|
@@ -363,8 +369,15 @@ module Procore
|
|
|
363
369
|
RestClient::Payload::has_file?(body)
|
|
364
370
|
end
|
|
365
371
|
|
|
366
|
-
def full_path(path)
|
|
367
|
-
|
|
372
|
+
def full_path(path, version)
|
|
373
|
+
version ||= options[:default_version]
|
|
374
|
+
if version == "vapid"
|
|
375
|
+
File.join(base_api_path, "vapid", path)
|
|
376
|
+
elsif /\Av\d+\.\d+\z/.match?(version)
|
|
377
|
+
File.join(base_api_path, "rest", version, path)
|
|
378
|
+
else
|
|
379
|
+
raise Procore::InvalidRequestError.new "#{version} is an invalid Procore API version"
|
|
380
|
+
end
|
|
368
381
|
end
|
|
369
382
|
end
|
|
370
383
|
end
|
data/lib/procore/response.rb
CHANGED
|
@@ -45,12 +45,11 @@ module Procore
|
|
|
45
45
|
# @return [Integer] Status Code returned from Procore API.
|
|
46
46
|
# @!attribute [r] pagination
|
|
47
47
|
# @return [Hash<Symbol, String>] Pagination URLs
|
|
48
|
-
attr_reader :headers, :code, :pagination, :request, :request_body
|
|
48
|
+
attr_reader :headers, :code, :pagination, :request, :request_body
|
|
49
49
|
|
|
50
|
-
def initialize(body:, headers:, code:, request:, request_body
|
|
50
|
+
def initialize(body:, headers:, code:, request:, request_body:)
|
|
51
51
|
@code = code
|
|
52
52
|
@headers = headers
|
|
53
|
-
@api_version = api_version
|
|
54
53
|
@pagination = parse_pagination
|
|
55
54
|
@request = request
|
|
56
55
|
@request_body = request_body
|
|
@@ -73,7 +72,7 @@ module Procore
|
|
|
73
72
|
|
|
74
73
|
def parse_pagination
|
|
75
74
|
headers[:link].to_s.split(", ").map(&:strip).reduce({}) do |links, link|
|
|
76
|
-
url, name = link.match(
|
|
75
|
+
url, name = link.match(/(?:vapid|rest\/.*?)\/(.*?)>; rel="(\w+)"/).captures
|
|
77
76
|
links.merge!(name.to_sym => url)
|
|
78
77
|
end
|
|
79
78
|
end
|
data/lib/procore/version.rb
CHANGED
data/procore-1.1.1.gem
ADDED
|
Binary file
|
data/procore.gemspec
CHANGED
|
@@ -32,6 +32,8 @@ Gem::Specification.new do |spec|
|
|
|
32
32
|
spec.add_development_dependency "rake"
|
|
33
33
|
spec.add_development_dependency "redis"
|
|
34
34
|
spec.add_development_dependency "rubocop"
|
|
35
|
+
spec.add_development_dependency "rubocop-performance"
|
|
36
|
+
spec.add_development_dependency "rubocop-rails"
|
|
35
37
|
spec.add_development_dependency "sqlite3"
|
|
36
38
|
spec.add_development_dependency "webmock"
|
|
37
39
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: procore
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 1.1.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Procore Engineering
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2021-06-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: actionpack
|
|
@@ -150,6 +150,34 @@ dependencies:
|
|
|
150
150
|
- - ">="
|
|
151
151
|
- !ruby/object:Gem::Version
|
|
152
152
|
version: '0'
|
|
153
|
+
- !ruby/object:Gem::Dependency
|
|
154
|
+
name: rubocop-performance
|
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
|
156
|
+
requirements:
|
|
157
|
+
- - ">="
|
|
158
|
+
- !ruby/object:Gem::Version
|
|
159
|
+
version: '0'
|
|
160
|
+
type: :development
|
|
161
|
+
prerelease: false
|
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
163
|
+
requirements:
|
|
164
|
+
- - ">="
|
|
165
|
+
- !ruby/object:Gem::Version
|
|
166
|
+
version: '0'
|
|
167
|
+
- !ruby/object:Gem::Dependency
|
|
168
|
+
name: rubocop-rails
|
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
|
170
|
+
requirements:
|
|
171
|
+
- - ">="
|
|
172
|
+
- !ruby/object:Gem::Version
|
|
173
|
+
version: '0'
|
|
174
|
+
type: :development
|
|
175
|
+
prerelease: false
|
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
177
|
+
requirements:
|
|
178
|
+
- - ">="
|
|
179
|
+
- !ruby/object:Gem::Version
|
|
180
|
+
version: '0'
|
|
153
181
|
- !ruby/object:Gem::Dependency
|
|
154
182
|
name: sqlite3
|
|
155
183
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -255,6 +283,7 @@ files:
|
|
|
255
283
|
- lib/procore/response.rb
|
|
256
284
|
- lib/procore/util.rb
|
|
257
285
|
- lib/procore/version.rb
|
|
286
|
+
- procore-1.1.1.gem
|
|
258
287
|
- procore.gemspec
|
|
259
288
|
homepage: https://github.com/procore/ruby-sdk
|
|
260
289
|
licenses:
|
|
@@ -275,7 +304,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
275
304
|
- !ruby/object:Gem::Version
|
|
276
305
|
version: '0'
|
|
277
306
|
requirements: []
|
|
278
|
-
|
|
307
|
+
rubyforge_project:
|
|
308
|
+
rubygems_version: 2.6.14
|
|
279
309
|
signing_key:
|
|
280
310
|
specification_version: 4
|
|
281
311
|
summary: Procore Ruby Gem
|