jekyll-activity-pub 0.1.0rc3 → 0.1.0rc4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 26bac0ac36c0c773eb36472016d30d6216f88ada00d9b8e1fe95724aad71d0ee
4
- data.tar.gz: 0b4a434b6822dce44b84e1686046a955f2a7bdc3dabc21c434ffe2d56ee14c21
3
+ metadata.gz: d66addf28845d3eab9189a74b092bd617d4b82cc96810ad7f22494c5b0a159de
4
+ data.tar.gz: 025d2cd2f35f9295219106e87bf63008d782e247f9fbe7d0d61f44091ee8d6aa
5
5
  SHA512:
6
- metadata.gz: c333f4bb7280710d5083fb09daabf4dd1dd84115a06859bdf4510c19dc7c63ee1a338cd0f1e80846388d3fde0468c33dfb358aa4987021259da645e9faa5893f
7
- data.tar.gz: abb2a481fb1371adca065370b66d56e9eccc71a43bfba2e73edde42c24dfddf85aca633a08e7e1e5a0b52ed58ab75561b567aa05bbd49d6985a23c63ae4a13f0
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
- attr_reader :data
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' => 'Create',
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
- trigger_hooks :post_init
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
- data.to_json
18
+ pruned_data.to_json
19
19
  end
20
20
 
21
21
  # JSONify this object
22
22
  def to_json(*args)
23
- data.to_json(*args)
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, status|
112
- done? object_url, status
111
+ data['notifications'].reject do |object_url, _|
112
+ done? object_url
113
113
  end.each do |object_url, status|
114
- object = PseudoObject.new(url: object_url, data: JSON.parse(File.read(site.in_dest_dir(object_url))))
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 [Hash]
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 [Hash]
148
+ # @return [nil]
147
149
  def update(path)
148
- action(path, exist?(path) ? 'update' : 'create')
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 [Hash]
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
- # Check if activity existed
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
- # @return [Boolean]
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
- data['notifications'].key? path_relative_to_dest(path)
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
- Pathname.new(site.in_dest_dir(path)).relative_path_from(site.dest).to_s
257
- end
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
- return original_content unless always_paginate? || paginable?
48
- return original_content if data['orderedItems'].empty?
49
-
50
- paged_data = data.dup
51
- pages = paginate(paged_data.delete('orderedItems'))
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
- assign_links! pages
56
+ assign_links! pages
54
57
 
55
- paged_data['first'] = absolute_url(pages.first.url)
56
- paged_data['last'] = absolute_url(pages.last.url)
58
+ paged_data['first'] = absolute_url(pages.first.url)
59
+ paged_data['last'] = absolute_url(pages.last.url)
57
60
 
58
- paged_data.to_json
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
@@ -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
- raise
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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-activity-pub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0rc3
4
+ version: 0.1.0rc4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sutty