jekyll-activity-pub 0.1.0rc2 → 0.1.0rc4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/jekyll/activity_pub/actor.rb +1 -0
- data/lib/jekyll/activity_pub/create.rb +29 -4
- data/lib/jekyll/activity_pub/delete.rb +7 -0
- data/lib/jekyll/activity_pub/helper.rb +8 -2
- data/lib/jekyll/activity_pub/notifier.rb +56 -22
- data/lib/jekyll/activity_pub/ordered_collection.rb +19 -9
- data/lib/jekyll/activity_pub/public_key.rb +0 -2
- data/lib/jekyll/activity_pub/update.rb +1 -14
- data/lib/jekyll-activity-pub.rb +20 -4
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d66addf28845d3eab9189a74b092bd617d4b82cc96810ad7f22494c5b0a159de
|
4
|
+
data.tar.gz: 025d2cd2f35f9295219106e87bf63008d782e247f9fbe7d0d61f44091ee8d6aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9bbf3bbae9a7499a3d5c981026d75d7f2ab4288d399355dbf98cff5dc49bf23302d578cc3f961867b2e00e80ea88b630203ecc26e8bfafa4690bb99981d3915a
|
7
|
+
data.tar.gz: c23fb0af3b4ecd6df91fb4f42b121fd52dff0370d11816df272c5e994b53e2608f4cb09a13edf952f8c6cd190f1685bc27526475279766bafc0c22b855ed923b
|
@@ -1,14 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'jekyll/page'
|
3
4
|
require_relative 'helper'
|
4
5
|
|
5
6
|
module Jekyll
|
6
7
|
module ActivityPub
|
7
8
|
# Represents a Create activity
|
8
|
-
class Create
|
9
|
+
class Create < Jekyll::Page
|
9
10
|
include Helper
|
10
11
|
|
11
|
-
|
12
|
+
# @param :object [Jekyll::ActivityPub::Activity]
|
13
|
+
attr_reader :object
|
14
|
+
|
15
|
+
# @param :actor [Jekyll::ActivityPub::Actor]
|
16
|
+
attr_reader :actor
|
12
17
|
|
13
18
|
# Initialize with default data
|
14
19
|
#
|
@@ -17,10 +22,26 @@ module Jekyll
|
|
17
22
|
# @param :object [Jekyll::ActivityPub::Activity]
|
18
23
|
def initialize(site, actor, object)
|
19
24
|
@context = StubContext.new(registers: { site: site })
|
25
|
+
@object = object
|
26
|
+
@actor = actor
|
20
27
|
|
28
|
+
dest = Pathname.new(object.destination(site.dest)).relative_path_from(site.dest)
|
29
|
+
name = "#{type.downcase}.jsonld"
|
30
|
+
dir = File.join(
|
31
|
+
File.dirname(dest),
|
32
|
+
File.basename(dest, '.jsonld')
|
33
|
+
)
|
34
|
+
|
35
|
+
super(site, '', dir, name)
|
36
|
+
|
37
|
+
trigger_hooks :post_init
|
38
|
+
end
|
39
|
+
|
40
|
+
def read_yaml(*)
|
21
41
|
@data = {
|
22
42
|
'@context' => 'https://www.w3.org/ns/activitystreams',
|
23
|
-
'type' =>
|
43
|
+
'type' => type,
|
44
|
+
'id' => absolute_url(url),
|
24
45
|
'actor' => absolute_url(actor.url),
|
25
46
|
'published' => object.data['published'],
|
26
47
|
'to' => object.data['to'],
|
@@ -28,8 +49,12 @@ module Jekyll
|
|
28
49
|
'object' => absolute_url(object.url),
|
29
50
|
'inReplyTo' => object.data['in_reply_to']
|
30
51
|
}
|
52
|
+
end
|
31
53
|
|
32
|
-
|
54
|
+
private
|
55
|
+
|
56
|
+
def type
|
57
|
+
@type ||= self.class.name.split('::').last
|
33
58
|
end
|
34
59
|
end
|
35
60
|
end
|
@@ -1,9 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'helper'
|
4
|
+
|
3
5
|
module Jekyll
|
4
6
|
module ActivityPub
|
5
7
|
# Represents a Delete activity
|
6
8
|
class Delete
|
9
|
+
include Helper
|
10
|
+
|
11
|
+
attr_reader :data
|
12
|
+
|
7
13
|
# Initialize with default data
|
8
14
|
#
|
9
15
|
# @param :site [Jekyll::Site]
|
@@ -14,6 +20,7 @@ module Jekyll
|
|
14
20
|
|
15
21
|
@data = {
|
16
22
|
'@context' => 'https://www.w3.org/ns/activitystreams',
|
23
|
+
'id' => absolute_url(object.url).sub('.jsonld', '/delete.jsonld'),
|
17
24
|
'type' => 'Delete',
|
18
25
|
'actor' => absolute_url(actor.url),
|
19
26
|
'object' => absolute_url(object.url)
|
@@ -15,12 +15,12 @@ module Jekyll
|
|
15
15
|
#
|
16
16
|
# @return [String]
|
17
17
|
def content
|
18
|
-
|
18
|
+
pruned_data.to_json
|
19
19
|
end
|
20
20
|
|
21
21
|
# JSONify this object
|
22
22
|
def to_json(*args)
|
23
|
-
|
23
|
+
pruned_data.to_json(*args)
|
24
24
|
end
|
25
25
|
|
26
26
|
# There's no excerpt to be generated
|
@@ -153,6 +153,12 @@ module Jekyll
|
|
153
153
|
|
154
154
|
absolute_url url
|
155
155
|
end
|
156
|
+
|
157
|
+
def pruned_data
|
158
|
+
data.reject do |_, v|
|
159
|
+
v.nil? || (v.respond_to?(:empty?) && v.empty?)
|
160
|
+
end
|
161
|
+
end
|
156
162
|
end
|
157
163
|
end
|
158
164
|
end
|
@@ -108,10 +108,12 @@ module Jekyll
|
|
108
108
|
end
|
109
109
|
|
110
110
|
# Remove notifications already performed and notify
|
111
|
-
data['notifications'].reject do |object_url,
|
112
|
-
done? object_url
|
111
|
+
data['notifications'].reject do |object_url, _|
|
112
|
+
done? object_url
|
113
113
|
end.each do |object_url, status|
|
114
|
-
|
114
|
+
path = site.in_dest_dir(object_url)
|
115
|
+
data = JSON.parse(File.read(path)) if File.exist? path
|
116
|
+
object = PseudoObject.new(url: object_url, data: data || {})
|
115
117
|
process_object(outbox_endpoint, actor_object, object, status)
|
116
118
|
end
|
117
119
|
|
@@ -134,34 +136,72 @@ module Jekyll
|
|
134
136
|
# Removes an activity if it was previously created
|
135
137
|
#
|
136
138
|
# @param :path [String]
|
137
|
-
# @return [
|
139
|
+
# @return [nil]
|
138
140
|
def delete(path)
|
139
|
-
action(path, 'delete') if exist? path
|
141
|
+
action(path, 'delete') if exist?(path) && !deleted?(path)
|
140
142
|
end
|
141
143
|
|
142
144
|
# Updates an activity if it was previously created, otherwise
|
143
145
|
# create it
|
144
146
|
#
|
145
147
|
# @param :path [String]
|
146
|
-
# @return [
|
148
|
+
# @return [nil]
|
147
149
|
def update(path)
|
148
|
-
|
150
|
+
if created?(path)
|
151
|
+
action(path, 'update')
|
152
|
+
else
|
153
|
+
create(path)
|
154
|
+
end
|
155
|
+
|
156
|
+
nil
|
149
157
|
end
|
150
158
|
|
151
|
-
# Creates an activity
|
159
|
+
# Creates an activity unless it has been already created
|
152
160
|
#
|
153
161
|
# @param :path [String]
|
154
|
-
# @return [
|
162
|
+
# @return [nil]
|
155
163
|
def create(path)
|
156
|
-
action(path, 'create')
|
164
|
+
action(path, 'create') unless created?(path)
|
165
|
+
|
166
|
+
nil
|
157
167
|
end
|
158
168
|
|
159
|
-
#
|
169
|
+
# Gets status
|
170
|
+
#
|
171
|
+
# @param :path [String]
|
172
|
+
# @return [Hash]
|
173
|
+
def status(path)
|
174
|
+
data['notifications'][path_relative_to_dest(path)] || {}
|
175
|
+
end
|
176
|
+
|
177
|
+
# Detects if an action was already done
|
160
178
|
#
|
161
179
|
# @param :path [String]
|
162
|
-
|
180
|
+
def done?(path)
|
181
|
+
(status(path)['action'] == 'done').tap do |done|
|
182
|
+
Jekyll.logger.debug('ActivityPub:', "Skipping notification for #{path}") if done
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
# Already created
|
187
|
+
#
|
188
|
+
# @param :path [String]
|
189
|
+
def created?(path)
|
190
|
+
!(status(path)['created_at'].nil?)
|
191
|
+
end
|
192
|
+
|
193
|
+
# @param :path [String]
|
194
|
+
def updated?(path)
|
195
|
+
!(status(path)['updated_at'].nil?)
|
196
|
+
end
|
197
|
+
|
198
|
+
# @param :path [String]
|
199
|
+
def deleted?(path)
|
200
|
+
!(status(path)['deleted_at'].nil?)
|
201
|
+
end
|
202
|
+
|
163
203
|
def exist?(path)
|
164
|
-
|
204
|
+
!(status(path)['action'].nil?)
|
165
205
|
end
|
166
206
|
|
167
207
|
# Stores data back to a file and optionally commits it
|
@@ -176,7 +216,7 @@ module Jekyll
|
|
176
216
|
File.open(path, 'w') do |f|
|
177
217
|
f.flock(File::LOCK_EX)
|
178
218
|
f.rewind
|
179
|
-
f.write(YAML.dump(data))
|
219
|
+
f.write(YAML.dump(data.reject { |_, v| v.empty? }))
|
180
220
|
f.flush
|
181
221
|
f.truncate(f.pos)
|
182
222
|
end
|
@@ -253,14 +293,8 @@ module Jekyll
|
|
253
293
|
# @param :path [String]
|
254
294
|
# @return [String]
|
255
295
|
def path_relative_to_dest(path)
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
# Detects if an action was already done
|
260
|
-
def done?(url, status)
|
261
|
-
(status['action'] == 'done').tap do |done|
|
262
|
-
Jekyll.logger.debug('ActivityPub:', "Skipping notification for #{url}") if done
|
263
|
-
end
|
296
|
+
@@path_relative_to_dest ||= {}
|
297
|
+
@@path_relative_to_dest[path] ||= Pathname.new(site.in_dest_dir(path)).relative_path_from(site.dest).to_s
|
264
298
|
end
|
265
299
|
|
266
300
|
# Turns an object into an activity and notifies outbox
|
@@ -43,19 +43,23 @@ module Jekyll
|
|
43
43
|
@content ||=
|
44
44
|
begin
|
45
45
|
order_items!
|
46
|
+
items_to_links!
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
if !always_paginate? || !paginable?
|
49
|
+
original_content
|
50
|
+
elsif data['orderedItems'].empty?
|
51
|
+
original_content
|
52
|
+
else
|
53
|
+
paged_data = data.dup
|
54
|
+
pages = paginate(paged_data.delete('orderedItems'))
|
52
55
|
|
53
|
-
|
56
|
+
assign_links! pages
|
54
57
|
|
55
|
-
|
56
|
-
|
58
|
+
paged_data['first'] = absolute_url(pages.first.url)
|
59
|
+
paged_data['last'] = absolute_url(pages.last.url)
|
57
60
|
|
58
|
-
|
61
|
+
paged_data.to_json
|
62
|
+
end
|
59
63
|
end
|
60
64
|
end
|
61
65
|
|
@@ -132,6 +136,12 @@ module Jekyll
|
|
132
136
|
b.data['published'] <=> a.data['published']
|
133
137
|
end
|
134
138
|
end
|
139
|
+
|
140
|
+
def items_to_links!
|
141
|
+
data['orderedItems'] = data['orderedItems'].map do |item|
|
142
|
+
item.data['id']
|
143
|
+
end
|
144
|
+
end
|
135
145
|
end
|
136
146
|
end
|
137
147
|
end
|
@@ -5,19 +5,6 @@ require_relative 'create'
|
|
5
5
|
module Jekyll
|
6
6
|
module ActivityPub
|
7
7
|
# Represents an Update activity
|
8
|
-
class Update < Create
|
9
|
-
# Initialize with default data
|
10
|
-
#
|
11
|
-
# @param :site [Jekyll::Site]
|
12
|
-
# @param :actor [Jekyll::ActivityPub::Actor]
|
13
|
-
# @param :object [Jekyll::ActivityPub::Activity]
|
14
|
-
def initialize(site, actor, object)
|
15
|
-
super
|
16
|
-
|
17
|
-
data['type'] = 'Update'
|
18
|
-
|
19
|
-
trigger_hooks :post_init
|
20
|
-
end
|
21
|
-
end
|
8
|
+
class Update < Create; end
|
22
9
|
end
|
23
10
|
end
|
data/lib/jekyll-activity-pub.rb
CHANGED
@@ -14,9 +14,11 @@ Jekyll::Hooks.register :site, :post_read, priority: :low do |site|
|
|
14
14
|
begin
|
15
15
|
private_key = File.read(site.config['activity_pub_private_key'])
|
16
16
|
rescue StandardError
|
17
|
-
Jekyll.logger.warn 'ActivityPub:', 'There\'s an issue with your private key'
|
17
|
+
Jekyll.logger.warn 'ActivityPub:', 'There\'s an issue with your private key, skipping generation'
|
18
18
|
|
19
|
-
|
19
|
+
site.config['activity_pub_disable'] = true
|
20
|
+
|
21
|
+
next
|
20
22
|
end
|
21
23
|
|
22
24
|
# We only need the public key at this point
|
@@ -42,15 +44,24 @@ end
|
|
42
44
|
# Generate an activity for each document after the content has been
|
43
45
|
# rendered as HTML.
|
44
46
|
Jekyll::Hooks.register(:documents, :post_convert, priority: :high) do |doc|
|
47
|
+
next if site.config['activity_pub_disable']
|
45
48
|
next unless doc.write?
|
46
49
|
next if doc.data['sitemap'] == false
|
47
50
|
next if doc.data['activity'] == false
|
48
51
|
|
49
52
|
site = doc.site
|
50
|
-
dir = File.dirname(doc.url)
|
51
|
-
name = "#{File.basename(doc.url, '.html')}.jsonld"
|
52
53
|
actor = site.config['actor']
|
53
54
|
outbox = site.config['outbox']
|
55
|
+
dest = doc.destination(site.dest)
|
56
|
+
dir = Pathname.new(File.dirname(dest)).relative_path_from(site.dest).to_s
|
57
|
+
|
58
|
+
# /slug/ => /slug.jsonld
|
59
|
+
if (n = File.basename(dest, '.html')) == 'index'
|
60
|
+
name = "#{File.basename(dir)}.jsonld"
|
61
|
+
dir = File.dirname(dir)
|
62
|
+
else
|
63
|
+
name = "#{n}.jsonld"
|
64
|
+
end
|
54
65
|
|
55
66
|
Jekyll::ActivityPub::Activity.new(site, actor, doc, nil, dir, name).tap do |activity|
|
56
67
|
doc.data['activity'] = activity
|
@@ -70,6 +81,7 @@ Jekyll::Hooks.register(:documents, :post_convert, priority: :high) do |doc|
|
|
70
81
|
|
71
82
|
outbox.data['totalItems'] += 1
|
72
83
|
outbox.data['orderedItems'] << action
|
84
|
+
site.pages << action
|
73
85
|
end
|
74
86
|
|
75
87
|
site.pages << activity
|
@@ -78,6 +90,8 @@ end
|
|
78
90
|
|
79
91
|
# This hook is shit because we don't have access to the site!
|
80
92
|
Jekyll::Hooks.register(:clean, :on_obsolete, priority: :low) do |list|
|
93
|
+
next if site.config['activity_pub_disable']
|
94
|
+
|
81
95
|
list.each do |path|
|
82
96
|
Jekyll::ActivityPub::Notifier.delete path
|
83
97
|
end
|
@@ -86,5 +100,7 @@ end
|
|
86
100
|
# Store data generated between builds and commits if
|
87
101
|
# jekyll-write-and-commit-changes is enabled.
|
88
102
|
Jekyll::Hooks.register(:site, :post_write, priority: :low) do |_|
|
103
|
+
next if site.config['activity_pub_disable']
|
104
|
+
|
89
105
|
Jekyll::ActivityPub::Notifier.save
|
90
106
|
end
|