webflow-ruby 0.6.0 → 1.2.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/.gitignore +2 -0
- data/.ruby-version +1 -1
- data/CHANGELOG.md +19 -0
- data/Gemfile.lock +21 -19
- data/LICENSE.txt +1 -1
- data/README.md +12 -11
- data/lib/webflow/client.rb +32 -35
- data/lib/webflow/config.rb +15 -0
- data/lib/webflow/error.rb +43 -0
- data/lib/webflow/ruby.rb +2 -0
- data/lib/webflow/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 21d5899eec3b30b220cc9504ac6bfae90a5ca8513527a7549ae92e0f3506f9a8
|
4
|
+
data.tar.gz: be3d265daec2d442c26ceb5711991d665223ed919434066b13ede91f6f1ac6b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc7d8c4dbd5b1e2305652a6909c7eb5c5d441338f7b0778644cce633640eb159d8b5893dd4ef93242712ae57f56b775443f64ca377101202b4ac79a355e95dee
|
7
|
+
data.tar.gz: dd9a55df590331f6dedc470055eff82d50511c19ca8d8d7eb80cd79ca4d8d0b66576373eac3562a0e93e9910a3f626038623d29cfbaaf2c65d78c69de7489ea2
|
data/.gitignore
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.7.1
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
## 1.2.1
|
2
|
+
* [FEATURE] Handle Problems in Validation errors https://github.com/penseo/webflow-ruby/pull/14 https://github.com/penseo/webflow-ruby/pull/16 😍 @vfonic @sega
|
3
|
+
|
4
|
+
## 1.2.0
|
5
|
+
* [FEATURE] Add patch support for updating items https://github.com/penseo/webflow-ruby/issues/10 😍 @ukd1
|
6
|
+
|
7
|
+
## 1.1.0
|
8
|
+
|
9
|
+
* [FEATURE] Allow passing a block to `items` that yields the results by page https://github.com/penseo/webflow-ruby/issues/9 😍 @emilesilvis
|
10
|
+
* [FEATURE] Handle Webflow live feature https://github.com/penseo/webflow-ruby/pull/8 😍 @emilesilvis
|
11
|
+
|
12
|
+
## 1.0.0
|
13
|
+
|
14
|
+
* [BREAKING] Raise errors when status > 200, see also https://github.com/penseo/webflow-ruby/pull/7 😍 @sega
|
15
|
+
|
16
|
+
## 0.7.0
|
17
|
+
|
18
|
+
* [FEATURE] Configuration class to store api token https://github.com/penseo/webflow-ruby/pull/6 😍 @mateuscruz
|
19
|
+
|
1
20
|
## 0.6.0
|
2
21
|
|
3
22
|
* [CHANGE] Use pure ruby dependencies
|
data/Gemfile.lock
CHANGED
@@ -1,38 +1,43 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
webflow-ruby (
|
4
|
+
webflow-ruby (1.2.0)
|
5
5
|
http
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
addressable (2.
|
11
|
-
public_suffix (>= 2.0.2, <
|
12
|
-
byebug (11.
|
10
|
+
addressable (2.7.0)
|
11
|
+
public_suffix (>= 2.0.2, < 5.0)
|
12
|
+
byebug (11.1.1)
|
13
13
|
crack (0.4.3)
|
14
14
|
safe_yaml (~> 1.0.0)
|
15
15
|
domain_name (0.5.20190701)
|
16
16
|
unf (>= 0.0.5, < 1.0.0)
|
17
|
-
|
18
|
-
|
17
|
+
ffi (1.12.2)
|
18
|
+
ffi-compiler (1.0.1)
|
19
|
+
ffi (>= 1.0.0)
|
20
|
+
rake
|
21
|
+
hashdiff (1.0.1)
|
22
|
+
http (4.4.1)
|
19
23
|
addressable (~> 2.3)
|
20
24
|
http-cookie (~> 1.0)
|
21
|
-
http-form_data (~> 2.
|
22
|
-
|
25
|
+
http-form_data (~> 2.2)
|
26
|
+
http-parser (~> 1.2.0)
|
23
27
|
http-cookie (1.0.3)
|
24
28
|
domain_name (~> 0.5)
|
25
|
-
http-form_data (2.
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
http-form_data (2.3.0)
|
30
|
+
http-parser (1.2.1)
|
31
|
+
ffi-compiler (>= 1.0, < 2.0)
|
32
|
+
minitest (5.14.0)
|
33
|
+
public_suffix (4.0.4)
|
34
|
+
rake (13.0.1)
|
30
35
|
safe_yaml (1.0.5)
|
31
36
|
unf (0.1.4)
|
32
37
|
unf_ext
|
33
|
-
unf_ext (0.0.7.
|
34
|
-
vcr (5.
|
35
|
-
webmock (3.
|
38
|
+
unf_ext (0.0.7.7)
|
39
|
+
vcr (5.1.0)
|
40
|
+
webmock (3.8.3)
|
36
41
|
addressable (>= 2.3.6)
|
37
42
|
crack (>= 0.3.2)
|
38
43
|
hashdiff (>= 0.4.0, < 2.0.0)
|
@@ -48,6 +53,3 @@ DEPENDENCIES
|
|
48
53
|
vcr
|
49
54
|
webflow-ruby!
|
50
55
|
webmock
|
51
|
-
|
52
|
-
BUNDLED WITH
|
53
|
-
2.0.2
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# Webflow [](https://travis-ci.org/penseo/webflow-ruby)
|
2
2
|
|
3
3
|
## Installation
|
4
|
-
|
5
4
|
Add this line to your application's Gemfile:
|
6
5
|
|
7
6
|
```ruby
|
@@ -10,33 +9,35 @@ gem 'webflow-ruby'
|
|
10
9
|
|
11
10
|
And then execute:
|
12
11
|
|
13
|
-
|
12
|
+
```bash
|
13
|
+
$ bundle
|
14
|
+
```
|
14
15
|
|
15
16
|
Or install it yourself as:
|
16
17
|
|
17
|
-
|
18
|
+
```bash
|
19
|
+
$ gem install webflow-ruby
|
20
|
+
```
|
18
21
|
|
19
22
|
## Usage
|
20
|
-
|
21
23
|
Have a look at the tests, seriously!
|
22
24
|
|
23
25
|
### Quick Start
|
24
26
|
```ruby
|
25
|
-
|
26
|
-
|
27
|
+
client = Webflow::Client.new(WEBFLOW_API_TOKEN)
|
28
|
+
sites = client.sites
|
27
29
|
```
|
28
30
|
|
29
31
|
## Todo
|
30
|
-
|
31
|
-
* Error handling, it's all JSON for now
|
32
32
|
* Resource mapping, it's plain hashes for now
|
33
|
-
* Proper docs
|
33
|
+
* Proper docs (please look at the tests for now)
|
34
34
|
|
35
35
|
## Contributing
|
36
|
-
|
37
36
|
Bug reports and pull requests are welcome on GitHub at https://github.com/penseo/webflow-ruby. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
38
37
|
|
38
|
+
## Plugins
|
39
|
+
* [webflow_sync](https://github.com/vfonic/webflow_sync) - Keep Rails models in sync with WebFlow collections.
|
39
40
|
|
40
|
-
## License
|
41
41
|
|
42
|
+
## License
|
42
43
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/lib/webflow/client.rb
CHANGED
@@ -4,13 +4,21 @@ module Webflow
|
|
4
4
|
class Client
|
5
5
|
HOST = 'https://api.webflow.com'
|
6
6
|
|
7
|
-
def initialize(token)
|
8
|
-
@token = token
|
7
|
+
def initialize(token = nil)
|
8
|
+
@token = token || Webflow.config.api_token
|
9
9
|
@rate_limit = {}
|
10
10
|
end
|
11
11
|
|
12
12
|
def rate_limit
|
13
|
-
@rate_limit
|
13
|
+
@rate_limit || {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def limit
|
17
|
+
rate_limit['X-Ratelimit-Limit'].to_i
|
18
|
+
end
|
19
|
+
|
20
|
+
def remaining
|
21
|
+
rate_limit['X-Ratelimit-Remaining'].to_i
|
14
22
|
end
|
15
23
|
|
16
24
|
def info
|
@@ -31,7 +39,7 @@ module Webflow
|
|
31
39
|
|
32
40
|
def publish(site_id, domain_names: nil)
|
33
41
|
domain_names ||= domains(site_id).map { |domain| domain['name'] }
|
34
|
-
post("/sites/#{site_id}/publish", domains: domain_names)
|
42
|
+
post("/sites/#{site_id}/publish", {domains: domain_names})
|
35
43
|
end
|
36
44
|
|
37
45
|
def collections(site_id)
|
@@ -67,7 +75,9 @@ module Webflow
|
|
67
75
|
|
68
76
|
num_pages.times do |i|
|
69
77
|
resp = paginate_items(collection_id, per_page: per_page, page: i+1)
|
70
|
-
|
78
|
+
items = resp['items']
|
79
|
+
yield(items) if block_given?
|
80
|
+
fetched_items += items
|
71
81
|
limit -= resp['count']
|
72
82
|
break if limit <= 0 || resp['total'] <= fetched_items.length
|
73
83
|
end
|
@@ -80,14 +90,12 @@ module Webflow
|
|
80
90
|
json['items'].first
|
81
91
|
end
|
82
92
|
|
83
|
-
def create_item(collection_id, data)
|
84
|
-
post("/collections/#{collection_id}/items", fields: data)
|
93
|
+
def create_item(collection_id, data, live: false)
|
94
|
+
post("/collections/#{collection_id}/items", {fields: data}, live: live)
|
85
95
|
end
|
86
96
|
|
87
|
-
def update_item(item, data)
|
88
|
-
|
89
|
-
base = item.reject {|key, _| ['_id', 'published-by', 'published-on', 'created-on', 'created-by', 'updated-by', 'updated-on', '_cid'].include?(key) }
|
90
|
-
put("/collections/#{item['_cid']}/items/#{item['_id']}", fields: base.merge(data))
|
97
|
+
def update_item(item, data, live: false)
|
98
|
+
patch("/collections/#{item['_cid']}/items/#{item['_id']}", {fields: data}, live: live)
|
91
99
|
end
|
92
100
|
|
93
101
|
def delete_item(item)
|
@@ -100,12 +108,14 @@ module Webflow
|
|
100
108
|
request(path, method: :get, params: params)
|
101
109
|
end
|
102
110
|
|
103
|
-
def post(path, data)
|
104
|
-
|
111
|
+
def post(path, data, live: nil)
|
112
|
+
params = { live: 'true' } if live
|
113
|
+
request(path, method: :post, params: params, data: data)
|
105
114
|
end
|
106
115
|
|
107
|
-
def
|
108
|
-
|
116
|
+
def patch(path, data, live: nil)
|
117
|
+
params = { live: 'true' } if live
|
118
|
+
request(path, method: :patch, params: params, data: data)
|
109
119
|
end
|
110
120
|
|
111
121
|
def delete(path)
|
@@ -119,30 +129,17 @@ module Webflow
|
|
119
129
|
|
120
130
|
response = HTTP.auth(bearer).headers(headers).request(method, url, params: params, json: data)
|
121
131
|
|
122
|
-
|
123
|
-
@rate_limit = rate_limit unless rate_limit.empty?
|
132
|
+
track_rate_limit(response.headers)
|
124
133
|
|
125
|
-
JSON.parse(response.body)
|
126
|
-
|
134
|
+
result = JSON.parse(response.body)
|
135
|
+
raise Webflow::Error.new(result) if response.code >= 400
|
127
136
|
|
128
|
-
|
137
|
+
result
|
129
138
|
end
|
130
139
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
[400, SyntaxError] => 'Request body was incorrectly formatted. Likely invalid JSON being sent up.',
|
135
|
-
[400, InvalidAPIVersion] => 'Requested an invalid API version',
|
136
|
-
[400, UnsupportedVersion] => 'Requested an API version that in unsupported by the requested route',
|
137
|
-
[400, NotImplemented] => 'This feature is not currently implemented',
|
138
|
-
[400, ValidationError] => 'Validation failure (see err field in the response)',
|
139
|
-
[400, Conflict] => 'Request has a conflict with existing data.',
|
140
|
-
[401, Unauthorized] => 'Provided access token is invalid or does not have access to requested resource',
|
141
|
-
[404, NotFound] => 'Requested resource not found',
|
142
|
-
[429, RateLimit] => 'The rate limit of the provided access_token has been reached. Please have your application respect the X-RateLimit-Remaining header we include on API responses.',
|
143
|
-
[500, ServerError] => 'We had a problem with our server. Try again later.',
|
144
|
-
[400, UnknownError] => 'An error occurred which is not enumerated here, but is not a server error.',
|
145
|
-
}
|
140
|
+
def track_rate_limit(headers)
|
141
|
+
rate_limit = headers.select { |key, value| key =~ /X-Ratelimit/ }.to_h
|
142
|
+
@rate_limit = rate_limit unless rate_limit.empty?
|
146
143
|
end
|
147
144
|
end
|
148
145
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Webflow
|
2
|
+
class Error < StandardError
|
3
|
+
# https://developers.webflow.com/#errors
|
4
|
+
# 400 SyntaxError Request body was incorrectly formatted. Likely invalid JSON being sent up.
|
5
|
+
# 400 InvalidAPIVersion Requested an invalid API version
|
6
|
+
# 400 UnsupportedVersion Requested an API version that in unsupported by the requested route
|
7
|
+
# 400 NotImplemented This feature is not currently implemented
|
8
|
+
# 400 ValidationError Validation failure (see problems field in the response)
|
9
|
+
# 400 Conflict Request has a conflict with existing data.
|
10
|
+
# 401 Unauthorized Provided access token is invalid or does not have access to requested resource
|
11
|
+
# 404 NotFound Requested resource not found
|
12
|
+
# 429 RateLimit The rate limit of the provided access_token has been reached. Please have your application respect the X-RateLimit-Remaining header we include on API responses.
|
13
|
+
# 500 ServerError We had a problem with our server. Try again later.
|
14
|
+
# 400 UnknownError An error occurred which is not enumerated here, but is not a server error.
|
15
|
+
#
|
16
|
+
# Sample error response
|
17
|
+
#
|
18
|
+
# {
|
19
|
+
# "msg": "Cannot access resource",
|
20
|
+
# "code": 401,
|
21
|
+
# "name": "Unauthorized",
|
22
|
+
# "path": "/sites/invalid_site",
|
23
|
+
# "err": "Unauthorized: Cannot access resource"
|
24
|
+
# }
|
25
|
+
|
26
|
+
attr_reader :data
|
27
|
+
|
28
|
+
def initialize(data)
|
29
|
+
@data = data
|
30
|
+
|
31
|
+
message = "#{data['msg']}#{': ' + Array(problems).join(', ') if problems?}"
|
32
|
+
super(message)
|
33
|
+
end
|
34
|
+
|
35
|
+
def problems?
|
36
|
+
!!data['problems']
|
37
|
+
end
|
38
|
+
|
39
|
+
def problems
|
40
|
+
data['problems']
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/webflow/ruby.rb
CHANGED
data/lib/webflow/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webflow-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- phoet
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http
|
@@ -130,6 +130,8 @@ files:
|
|
130
130
|
- bin/setup
|
131
131
|
- lib/webflow.rb
|
132
132
|
- lib/webflow/client.rb
|
133
|
+
- lib/webflow/config.rb
|
134
|
+
- lib/webflow/error.rb
|
133
135
|
- lib/webflow/ruby.rb
|
134
136
|
- lib/webflow/version.rb
|
135
137
|
- webflow.gemspec
|
@@ -152,8 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
152
154
|
- !ruby/object:Gem::Version
|
153
155
|
version: '0'
|
154
156
|
requirements: []
|
155
|
-
|
156
|
-
rubygems_version: 2.7.6
|
157
|
+
rubygems_version: 3.1.2
|
157
158
|
signing_key:
|
158
159
|
specification_version: 4
|
159
160
|
summary: Webflow API bindings for Ruby
|