dato 0.6.18 → 0.7.0
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/CHANGELOG.md +4 -0
- data/lib/dato/cli.rb +10 -10
- data/lib/dato/dump/format.rb +1 -0
- data/lib/dato/dump/runner.rb +3 -10
- data/lib/dato/local/entities_repo.rb +22 -8
- data/lib/dato/local/loader.rb +134 -6
- data/lib/dato/site/client.rb +8 -0
- data/lib/dato/version.rb +1 -1
- metadata +2 -3
- data/lib/dato/watch/site_change_watcher.rb +0 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ae6a3e8219a9628772a2f4da2bdd5b8024042c765d6ea1582b94c2f86c59f81
|
4
|
+
data.tar.gz: 8d56caeecb617c3eda4072c9ff649e596fe4968c1b64b46c639804f23222fbd7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45fd8ebe07494123845f26eac19162a9c3a53f435607812ff0fa336567993171b73cd4f703d9f1b52f41c9c3758a366788bfde944a18f7aa92e762f8250426d4
|
7
|
+
data.tar.gz: 7078abd9cd150a79ca7d264094ef60321574fb4763020e5c473de9530c6e5c285d885ce792d6eea4f522b5a63f360c240c1dd0b3942f309df2912c74a8944ee0
|
data/CHANGELOG.md
CHANGED
data/lib/dato/cli.rb
CHANGED
@@ -3,7 +3,6 @@
|
|
3
3
|
require 'thor'
|
4
4
|
require 'dato/dump/runner'
|
5
5
|
require 'dato/dump/ssg_detector'
|
6
|
-
require 'dato/watch/site_change_watcher'
|
7
6
|
require 'listen'
|
8
7
|
module Dato
|
9
8
|
class Cli < Thor
|
@@ -26,25 +25,26 @@ module Dato
|
|
26
25
|
'X-SSG' => Dump::SsgDetector.new(Dir.pwd).detect
|
27
26
|
}
|
28
27
|
)
|
28
|
+
loader = Dato::Local::Loader.new(client, preview_mode)
|
29
|
+
print 'Fetching content from DatoCMS... '
|
30
|
+
loader.load
|
29
31
|
|
30
32
|
if watch_mode
|
31
|
-
site_id = client.request(:get, '/site')['data']['id']
|
32
|
-
|
33
33
|
semaphore = Mutex.new
|
34
34
|
|
35
|
-
thread_safe_dump(semaphore, config_file, client, preview_mode)
|
35
|
+
thread_safe_dump(semaphore, config_file, client, preview_mode, loader)
|
36
36
|
|
37
|
-
|
38
|
-
thread_safe_dump(semaphore, config_file, client, preview_mode)
|
37
|
+
loader.watch do
|
38
|
+
thread_safe_dump(semaphore, config_file, client, preview_mode, loader)
|
39
39
|
end
|
40
40
|
|
41
41
|
watch_config_file(config_file) do
|
42
|
-
thread_safe_dump(semaphore, config_file, client, preview_mode)
|
42
|
+
thread_safe_dump(semaphore, config_file, client, preview_mode, loader)
|
43
43
|
end
|
44
44
|
|
45
45
|
sleep
|
46
46
|
else
|
47
|
-
Dump::Runner.new(config_file, client, preview_mode).run
|
47
|
+
Dump::Runner.new(config_file, client, preview_mode, loader).run
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -78,9 +78,9 @@ module Dato
|
|
78
78
|
).start
|
79
79
|
end
|
80
80
|
|
81
|
-
def thread_safe_dump(semaphore, config_file, client, preview_mode)
|
81
|
+
def thread_safe_dump(semaphore, config_file, client, preview_mode, loader)
|
82
82
|
semaphore.synchronize do
|
83
|
-
Dump::Runner.new(config_file, client, preview_mode).run
|
83
|
+
Dump::Runner.new(config_file, client, preview_mode, loader).run
|
84
84
|
end
|
85
85
|
end
|
86
86
|
end
|
data/lib/dato/dump/format.rb
CHANGED
data/lib/dato/dump/runner.rb
CHANGED
@@ -8,20 +8,17 @@ require 'dato/local/loader'
|
|
8
8
|
module Dato
|
9
9
|
module Dump
|
10
10
|
class Runner
|
11
|
-
attr_reader :config_path, :client, :destination_path, :preview_mode
|
11
|
+
attr_reader :config_path, :client, :destination_path, :preview_mode, :loader
|
12
12
|
|
13
|
-
def initialize(config_path, client, preview_mode, destination_path = Dir.pwd)
|
13
|
+
def initialize(config_path, client, preview_mode, loader, destination_path = Dir.pwd)
|
14
14
|
@config_path = config_path
|
15
15
|
@preview_mode = preview_mode
|
16
16
|
@client = client
|
17
17
|
@destination_path = destination_path
|
18
|
+
@loader = loader
|
18
19
|
end
|
19
20
|
|
20
21
|
def run
|
21
|
-
print 'Fetching content from DatoCMS... '
|
22
|
-
|
23
|
-
loader.load
|
24
|
-
|
25
22
|
I18n.available_locales = loader.items_repo.available_locales
|
26
23
|
I18n.locale = I18n.available_locales.first
|
27
24
|
|
@@ -39,10 +36,6 @@ module Dato
|
|
39
36
|
def operation
|
40
37
|
@operation ||= Operation::Root.new(destination_path)
|
41
38
|
end
|
42
|
-
|
43
|
-
def loader
|
44
|
-
@loader ||= Dato::Local::Loader.new(client, preview_mode)
|
45
|
-
end
|
46
39
|
end
|
47
40
|
end
|
48
41
|
end
|
@@ -9,14 +9,7 @@ module Dato
|
|
9
9
|
|
10
10
|
def initialize(*payloads)
|
11
11
|
@entities = {}
|
12
|
-
|
13
|
-
payloads.each do |payload|
|
14
|
-
EntitiesRepo.payload_entities(payload).each do |entity_payload|
|
15
|
-
object = JsonApiEntity.new(entity_payload, self)
|
16
|
-
@entities[object.type] ||= {}
|
17
|
-
@entities[object.type][object.id] = object
|
18
|
-
end
|
19
|
-
end
|
12
|
+
upsert_entities(*payloads)
|
20
13
|
end
|
21
14
|
|
22
15
|
def find_entities_of_type(type)
|
@@ -27,6 +20,27 @@ module Dato
|
|
27
20
|
entities.fetch(type, {}).fetch(id, nil)
|
28
21
|
end
|
29
22
|
|
23
|
+
def destroy_entities(type, ids)
|
24
|
+
ids.each do |id|
|
25
|
+
entities.fetch(type, {}).delete(id)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def destroy_item_type(id)
|
30
|
+
entities.fetch('item', {}).delete_if { |_item_id, item| item.item_type.id == id }
|
31
|
+
entities.fetch('item_type', {}).delete(id)
|
32
|
+
end
|
33
|
+
|
34
|
+
def upsert_entities(*payloads)
|
35
|
+
payloads.each do |payload|
|
36
|
+
EntitiesRepo.payload_entities(payload).each do |entity_payload|
|
37
|
+
object = JsonApiEntity.new(entity_payload, self)
|
38
|
+
@entities[object.type] ||= {}
|
39
|
+
@entities[object.type][object.id] = object
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
30
44
|
def self.payload_entities(payload)
|
31
45
|
acc = []
|
32
46
|
|
data/lib/dato/local/loader.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'pusher-client'
|
4
|
+
|
3
5
|
require 'dato/local/entities_repo'
|
4
6
|
require 'dato/local/items_repo'
|
5
7
|
|
@@ -11,6 +13,8 @@ module Dato
|
|
11
13
|
attr_reader :items_repo
|
12
14
|
attr_reader :preview_mode
|
13
15
|
|
16
|
+
PUSHER_API_KEY = '75e6ef0fe5d39f481626'
|
17
|
+
|
14
18
|
def initialize(client, preview_mode = false)
|
15
19
|
@client = client
|
16
20
|
@preview_mode = preview_mode
|
@@ -34,8 +38,122 @@ module Dato
|
|
34
38
|
@items_repo = ItemsRepo.new(@entities_repo)
|
35
39
|
end
|
36
40
|
|
41
|
+
def watch(&block)
|
42
|
+
site_id = client.request(:get, '/site')['data']['id']
|
43
|
+
|
44
|
+
return if pusher && pusher.connected
|
45
|
+
|
46
|
+
pusher.subscribe("private-site-#{site_id}")
|
47
|
+
|
48
|
+
bind_on_item_destroy(&block)
|
49
|
+
bind_on_item_upsert(&block)
|
50
|
+
bind_on_item_type_upsert(&block)
|
51
|
+
bind_on_item_type_destroy(&block)
|
52
|
+
bind_on_upload_upsert(&block)
|
53
|
+
bind_on_upload_destroy(&block)
|
54
|
+
|
55
|
+
pusher.connect(true)
|
56
|
+
end
|
57
|
+
|
58
|
+
def stop_watch
|
59
|
+
pusher.disconnect if pusher && pusher.connected
|
60
|
+
end
|
61
|
+
|
37
62
|
private
|
38
63
|
|
64
|
+
def bind_on_item_upsert(&block)
|
65
|
+
event_type = preview_mode ? 'preview_mode' : 'published_mode'
|
66
|
+
|
67
|
+
bind_on("item:#{event_type}:upsert", block) do |data|
|
68
|
+
payload = client.items.all(
|
69
|
+
{
|
70
|
+
'filter[ids]' => data[:ids].join(','),
|
71
|
+
version: item_version
|
72
|
+
},
|
73
|
+
deserialize_response: false,
|
74
|
+
all_pages: true
|
75
|
+
)
|
76
|
+
|
77
|
+
@entities_repo.upsert_entities(payload)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def bind_on_item_destroy(&block)
|
82
|
+
event_type = preview_mode ? 'preview_mode' : 'published_mode'
|
83
|
+
|
84
|
+
bind_on("item:#{event_type}:destroy", block) do |data|
|
85
|
+
@entities_repo.destroy_entities('item', data[:ids])
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def bind_on_upload_upsert(&block)
|
90
|
+
bind_on("upload:upsert", block) do |data|
|
91
|
+
payload = client.uploads.all(
|
92
|
+
{
|
93
|
+
'filter[ids]' => data[:ids].join(',')
|
94
|
+
},
|
95
|
+
deserialize_response: false,
|
96
|
+
all_pages: true
|
97
|
+
)
|
98
|
+
|
99
|
+
@entities_repo.upsert_entities(payload)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def bind_on_upload_destroy(&block)
|
104
|
+
bind_on('upload:destroy', block) do |data|
|
105
|
+
@entities_repo.destroy_entities('upload', data[:ids])
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def bind_on_item_type_upsert(&block)
|
110
|
+
bind_on('item_type:upsert', block) do |data|
|
111
|
+
data[:ids].each do |id|
|
112
|
+
payload = client.item_types.find(id, {}, deserialize_response: false)
|
113
|
+
@entities_repo.upsert_entities(payload)
|
114
|
+
|
115
|
+
payload = client.items.all(
|
116
|
+
{ 'filter[type]' => id },
|
117
|
+
deserialize_response: false,
|
118
|
+
all_pages: true
|
119
|
+
)
|
120
|
+
|
121
|
+
@entities_repo.upsert_entities(payload)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def bind_on_item_type_destroy(&block)
|
127
|
+
bind_on('item_type:destroy', block) do |data|
|
128
|
+
data[:ids].each do |id|
|
129
|
+
@entities_repo.destroy_item_type(id)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def bind_on(event_name, user_block, &block)
|
135
|
+
pusher.bind(event_name) do |data|
|
136
|
+
parsed_data = JSON.parse(data)
|
137
|
+
block.call(parsed_data.deep_symbolize_keys)
|
138
|
+
update_items_repo!
|
139
|
+
user_block.call
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def update_items_repo!
|
144
|
+
@items_repo = ItemsRepo.new(@entities_repo)
|
145
|
+
end
|
146
|
+
|
147
|
+
def pusher
|
148
|
+
PusherClient.logger.level = Logger::WARN
|
149
|
+
|
150
|
+
@pusher ||= PusherClient::Socket.new(
|
151
|
+
PUSHER_API_KEY,
|
152
|
+
secure: true,
|
153
|
+
auth_method: method(:pusher_auth_method)
|
154
|
+
)
|
155
|
+
end
|
156
|
+
|
39
157
|
def site
|
40
158
|
include = ['item_types', 'item_types.fields']
|
41
159
|
client.request(:get, '/site', include: include)
|
@@ -43,18 +161,28 @@ module Dato
|
|
43
161
|
|
44
162
|
def all_items
|
45
163
|
client.items.all(
|
46
|
-
{ version:
|
164
|
+
{ version: item_version },
|
47
165
|
deserialize_response: false,
|
48
166
|
all_pages: true
|
49
167
|
)
|
50
168
|
end
|
51
169
|
|
52
170
|
def all_uploads
|
53
|
-
client.uploads.all(
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
171
|
+
client.uploads.all({},
|
172
|
+
deserialize_response: false,
|
173
|
+
all_pages: true)
|
174
|
+
end
|
175
|
+
|
176
|
+
def item_version
|
177
|
+
if preview_mode
|
178
|
+
'latest'
|
179
|
+
else
|
180
|
+
'published'
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def pusher_auth_method(socket_id, channel)
|
185
|
+
client.pusher_token(socket_id, channel.name)["auth"]
|
58
186
|
end
|
59
187
|
end
|
60
188
|
end
|
data/lib/dato/site/client.rb
CHANGED
@@ -20,6 +20,14 @@ module Dato
|
|
20
20
|
file = Upload::Image.new(self, path_or_url)
|
21
21
|
file.upload
|
22
22
|
end
|
23
|
+
|
24
|
+
def pusher_token(socket_id, channel)
|
25
|
+
request(
|
26
|
+
:post,
|
27
|
+
"/pusher/authenticate",
|
28
|
+
{ socket_id: socket_id, channel_name: channel}
|
29
|
+
)
|
30
|
+
end
|
23
31
|
end
|
24
32
|
end
|
25
33
|
end
|
data/lib/dato/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dato
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefano Verna
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -456,7 +456,6 @@ files:
|
|
456
456
|
- lib/dato/utils/meta_tags/twitter_site.rb
|
457
457
|
- lib/dato/utils/seo_tags_builder.rb
|
458
458
|
- lib/dato/version.rb
|
459
|
-
- lib/dato/watch/site_change_watcher.rb
|
460
459
|
homepage: https://github.com/datocms/ruby-datocms-client
|
461
460
|
licenses:
|
462
461
|
- MIT
|
@@ -1,38 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'pusher-client'
|
4
|
-
|
5
|
-
module Dato
|
6
|
-
module Watch
|
7
|
-
class SiteChangeWatcher
|
8
|
-
attr_reader :site_id
|
9
|
-
|
10
|
-
PUSHER_API_KEY = '75e6ef0fe5d39f481626'
|
11
|
-
|
12
|
-
def initialize(site_id)
|
13
|
-
PusherClient.logger.level = Logger::WARN
|
14
|
-
@site_id = site_id
|
15
|
-
@socket = nil
|
16
|
-
end
|
17
|
-
|
18
|
-
def connect(&block)
|
19
|
-
return if connected?
|
20
|
-
|
21
|
-
@socket = PusherClient::Socket.new(PUSHER_API_KEY, secure: true)
|
22
|
-
@socket.subscribe("site-#{site_id}")
|
23
|
-
@socket.bind('site:change', &block)
|
24
|
-
@socket.connect(true)
|
25
|
-
|
26
|
-
self
|
27
|
-
end
|
28
|
-
|
29
|
-
def connected?
|
30
|
-
@socket && @socket.connected
|
31
|
-
end
|
32
|
-
|
33
|
-
def disconnect!
|
34
|
-
connected? && @socket.disconnect
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|