jekyll-spree-client 0.1.4 → 0.1.9
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/README.md +51 -18
- data/lib/jekyll-spree-client.rb +13 -1
- data/lib/jekyll/spree_client.rb +19 -15
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 345d7f0e45d1c821288d7a4452601c163f2d82304d317dc72ec425d6abd5cb47
|
4
|
+
data.tar.gz: b74a132ff5c5592c2989bff62b2403e9a6cb10eacf4af715b5ee287c404f19a6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a92e70c17670182523b32ad5e5f6038f3fa0611c23c731a61b30e9f36cb30df6f65dd406921830b35dda8fd303cb60f8738e2e895c73f180390a482762e6725f
|
7
|
+
data.tar.gz: f918174d0812624c71174e3c414160daa90c28539c1ae32859ce4c2046aa94ff9c222b5a551d3174009975c31939c7de75c30172a1a419290763b7249bf2418a
|
data/README.md
CHANGED
@@ -16,16 +16,6 @@ conversion unless you store prices as strings.
|
|
16
16
|
|
17
17
|
You can use Integer and Floats now!
|
18
18
|
|
19
|
-
### Update
|
20
|
-
|
21
|
-
The issue is that Spree expects to receive prices in the locale format
|
22
|
-
(ie, "200,00") but will return them on Ruby's `to_s` conversion
|
23
|
-
("200.0") so we need to reconvert them to our current format and juggle
|
24
|
-
between them.
|
25
|
-
|
26
|
-
We'll deal with `Integer` for now until we find [a better
|
27
|
-
solution](https://github.com/spree/spree/issues/10556).
|
28
|
-
|
29
19
|
## Installation
|
30
20
|
|
31
21
|
Add this line to your site's Gemfile:
|
@@ -77,8 +67,10 @@ Add the required fields in their frontmatter:
|
|
77
67
|
---
|
78
68
|
layout: post
|
79
69
|
title: A product
|
70
|
+
description: With a description
|
80
71
|
sku: A unique ID
|
81
72
|
price: 100.00
|
73
|
+
cost_price: 50.0
|
82
74
|
stock: 100
|
83
75
|
weight: 100
|
84
76
|
height: 100
|
@@ -90,18 +82,52 @@ depth: 100
|
|
90
82
|
The layout doesn't matter, but we recommend to use a layout for
|
91
83
|
products.
|
92
84
|
|
85
|
+
### Hooks
|
86
|
+
|
87
|
+
If you need to do some data manipulation before and after
|
88
|
+
synchronization is done, you can use hooks. In a `_plugins/spree.rb`
|
89
|
+
file:
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
Jekyll::Hooks.register :spree, :pre_render do |spree|
|
93
|
+
spree.local_products.each do |product|
|
94
|
+
product.data['_description'] = product.data['description']
|
95
|
+
product.data['description'] = product.data['productore']&.data&.dig('title')
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
Jekyll::Hooks.register :spree, :post_render do |spree|
|
100
|
+
spree.local_products.each do |product|
|
101
|
+
product.data['description'] = product.data.delete '_description'
|
102
|
+
|
103
|
+
product.data.delete 'description' unless product.data['description']
|
104
|
+
end
|
105
|
+
end
|
106
|
+
```
|
107
|
+
|
108
|
+
This plugin gets the description value from another document (they're
|
109
|
+
linked using
|
110
|
+
[jekyll-linked-posts](https://0xacab.org/sutty/jekyll/jekyll-linked-posts/),
|
111
|
+
it's a real example!), and then recovers it.
|
112
|
+
|
113
|
+
* `pre_render` runs just before starting synchronization
|
114
|
+
* `post_render` run after synchronization and before writing changes
|
115
|
+
|
93
116
|
### Building the site
|
94
117
|
|
95
118
|
During site build, the plugin will communicate with the Spree API and
|
96
|
-
create products when they don't exist or update their price,
|
97
|
-
stock and the other values.
|
119
|
+
create products when they don't exist or locally update their price,
|
120
|
+
current stock and the other values.
|
98
121
|
|
99
122
|
Some fields will appear on the frontmatter:
|
100
123
|
|
101
124
|
```yaml
|
102
125
|
variant_id: 1
|
103
126
|
in_stock: true
|
104
|
-
|
127
|
+
errors:
|
128
|
+
time: 2020-10-10 00:00:00 UTC
|
129
|
+
messages:
|
130
|
+
- Something went wrong
|
105
131
|
```
|
106
132
|
|
107
133
|
* `variant_id` is the ID in the Spree database.
|
@@ -109,11 +135,17 @@ sync_error: 2020-10-10 00:00:00 UTC
|
|
109
135
|
* `in_stock` is true or false according to availability (Spree decides
|
110
136
|
this).
|
111
137
|
|
112
|
-
* `
|
113
|
-
here.
|
138
|
+
* `errors` if the synchronization fails there will be a timestamp and
|
139
|
+
some messages here.
|
114
140
|
|
115
141
|
## Notes
|
116
142
|
|
143
|
+
* Synchronization is unidirectional. If the product doesn't exist on
|
144
|
+
Spree, it's created. If it does, the Jekyll document is updated.
|
145
|
+
|
146
|
+
We want this to change in the near future but we need to think a way
|
147
|
+
to prevent conflicts.
|
148
|
+
|
117
149
|
* All products are created as "master variants" on Spree. There will be
|
118
150
|
no pictures, taxonomies or other values, only basic product
|
119
151
|
information.
|
@@ -126,11 +158,12 @@ sync_error: 2020-10-10 00:00:00 UTC
|
|
126
158
|
* Stock is added to the default stock location, meaning the first active
|
127
159
|
one. The API doesn't show or allows to query the actual default.
|
128
160
|
|
129
|
-
*
|
161
|
+
* `price` and `cost_price` are expressed in Spree's default currency.
|
130
162
|
|
131
163
|
* If you install the `jekyll-write-and-commit-changes` plugin it will
|
132
|
-
save the data back to disk when you build
|
133
|
-
environment variable
|
164
|
+
save the data back to disk when you build. Using the
|
165
|
+
`JEKYLL_ENV=production` environment variable will also commit changes
|
166
|
+
to git.
|
134
167
|
|
135
168
|
* Check the shipping category ID on Spree, since there's no API for it,
|
136
169
|
you need to provide it manually, default is `1`.
|
data/lib/jekyll-spree-client.rb
CHANGED
@@ -6,7 +6,9 @@ require_relative 'jekyll/spree_client'
|
|
6
6
|
# matter. The SKU needs to be unique, but this plugin doesn't ensure
|
7
7
|
# that. Duplicated SKUs will be silently ignored for now.
|
8
8
|
Jekyll::Hooks.register :site, :post_read do |site|
|
9
|
-
|
9
|
+
next unless ENV['SPREE_API_KEY']
|
10
|
+
|
11
|
+
config = site.config['spree']&.transform_keys(&:to_sym) || {}
|
10
12
|
config.merge!(site: site, api_key: ENV['SPREE_API_KEY'], spree_url: ENV['SPREE_URL'])
|
11
13
|
|
12
14
|
client = Jekyll::SpreeClient.new **config
|
@@ -16,4 +18,14 @@ Jekyll::Hooks.register :site, :post_read do |site|
|
|
16
18
|
if ENV['JEKYLL_ENV'] == 'production' && site.respond_to?(:repository)
|
17
19
|
site.repository.commit site.data.dig(site.config['locale'], 'spree', 'commit') || 'Spree synchronization'
|
18
20
|
end
|
21
|
+
|
22
|
+
# Ordered articles
|
23
|
+
posts = site.site_payload['site']['posts']
|
24
|
+
|
25
|
+
# Make steps available to other articles
|
26
|
+
%w[cart shipment payment confirmation].each do |step|
|
27
|
+
site.config[step] = posts.find do |doc|
|
28
|
+
doc.data['layout'] == step
|
29
|
+
end
|
30
|
+
end
|
19
31
|
end
|
data/lib/jekyll/spree_client.rb
CHANGED
@@ -33,7 +33,7 @@ module Jekyll
|
|
33
33
|
#
|
34
34
|
# @return [Array]
|
35
35
|
def variant_fields
|
36
|
-
@variant_fields ||= %w[price weight height width depth].freeze
|
36
|
+
@variant_fields ||= %w[price weight height width depth description cost_price].freeze
|
37
37
|
end
|
38
38
|
|
39
39
|
# Spree Client
|
@@ -56,6 +56,8 @@ module Jekyll
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def sync!
|
59
|
+
Jekyll::Hooks.trigger :spree, :pre_render, self
|
60
|
+
|
59
61
|
# The API allows to query several SKUs at the same time, so we send
|
60
62
|
# groups of 10 products.
|
61
63
|
local_products.each_slice(10) do |products|
|
@@ -68,13 +70,14 @@ module Jekyll
|
|
68
70
|
products.each do |p|
|
69
71
|
mark_with_error p,
|
70
72
|
i18n.dig('spree', 'errors', 'api') || "Couldn't obtain variants, the store may be down or API key is incorrect"
|
71
|
-
local_save p.save
|
72
73
|
end
|
73
74
|
|
74
75
|
next
|
75
76
|
end
|
76
77
|
|
77
78
|
products.each do |product|
|
79
|
+
# Remove previous errors
|
80
|
+
product.data.delete 'errors'
|
78
81
|
# Find the corresponding Spree variant in the response
|
79
82
|
variant = response['variants'].find do |v|
|
80
83
|
v[sku_field] == product.data[sku_field]
|
@@ -88,6 +91,12 @@ module Jekyll
|
|
88
91
|
end
|
89
92
|
end
|
90
93
|
end
|
94
|
+
|
95
|
+
Jekyll::Hooks.trigger :spree, :post_render, self
|
96
|
+
|
97
|
+
local_products.each do |product|
|
98
|
+
local_save product
|
99
|
+
end
|
91
100
|
end
|
92
101
|
|
93
102
|
private
|
@@ -152,19 +161,18 @@ module Jekyll
|
|
152
161
|
def update(product, variant)
|
153
162
|
# XXX: The API replies with stringified numbers so we convert them
|
154
163
|
# back to the type we're using locally.
|
155
|
-
|
156
|
-
case product.data[k]
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
end
|
164
|
+
variant.slice(*variant_fields).each do |k, v|
|
165
|
+
product.data[k] = case product.data[k]
|
166
|
+
when Integer then v.to_i
|
167
|
+
when Float then v.to_f
|
168
|
+
else v
|
169
|
+
end
|
170
|
+
end
|
162
171
|
|
163
172
|
product.data['in_stock'] = variant['in_stock']
|
164
173
|
product.data['variant_id'] = variant['id']
|
165
|
-
product.data.delete 'errors'
|
166
174
|
|
167
|
-
|
175
|
+
product
|
168
176
|
end
|
169
177
|
|
170
178
|
# If the product doesn't exist, create it.
|
@@ -179,16 +187,12 @@ module Jekyll
|
|
179
187
|
unless remote_products.create **new_product
|
180
188
|
Jekyll.logger.error "Couldn't create #{product.data['title']}"
|
181
189
|
mark_with_error product, error_messages
|
182
|
-
local_save product
|
183
190
|
|
184
191
|
return false
|
185
192
|
end
|
186
193
|
|
187
194
|
product.data['variant_id'] = remote_products.response.dig('master', 'id')
|
188
195
|
|
189
|
-
# Save the variant ID
|
190
|
-
local_save product
|
191
|
-
|
192
196
|
# Add the initial stock
|
193
197
|
spree.stock_items(id: product.data['variant_id'], stock_location_id: stock_location['id'])
|
194
198
|
.stock_movements.create(quantity: product.data['stock'])
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-spree-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- f
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: spree-api-client
|