activitypub 0.3.6 → 0.4.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/examples/get_actor.rb +7 -23
- data/lib/activitypub/base.rb +15 -3
- data/lib/activitypub/types.rb +74 -19
- data/lib/activitypub/uri.rb +23 -0
- data/lib/activitypub/version.rb +1 -1
- data/lib/activitypub/webfinger.rb +27 -0
- data/lib/activitypub.rb +3 -0
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c8cae4b7204912811e11efa38d689ee0cb418c480a7e3240a70a8d4dcafd699
|
4
|
+
data.tar.gz: 4c732f4669c8ed60428d75b45bda5aac7ffa24e439d9fc4f8c733e51241438f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f5e26e20e624d3c9ae77f66832e8ed6bee1516c84ec4cc1ef2d24f47b468c2e473ee15e4ecab7e000e910adef998870df26650aa7060753d5430dfb699c8717
|
7
|
+
data.tar.gz: 40cfe87f071e5b8be1e6848f86232523f206e90b8b78c25ad9be0b7aa29c7b72f3da6c64da669edc384424c1e7ea9b4b5f813a15c0b1816ee3360568ec5d40cf
|
data/examples/get_actor.rb
CHANGED
@@ -1,17 +1,14 @@
|
|
1
1
|
|
2
|
-
require 'webfinger'
|
3
|
-
require 'faraday'
|
4
2
|
require 'pp'
|
5
3
|
$: << File.expand_path(__FILE__ + "/../../lib")
|
6
|
-
require 'activitypub
|
7
|
-
require 'activitypub/base'
|
4
|
+
require 'activitypub'
|
8
5
|
|
9
6
|
acct = ARGV.shift || "vidar@galaxybound.com"
|
10
7
|
|
11
8
|
puts "Trying webfinger for #{acct} (to choose your own account, provide it as an argument)"
|
12
9
|
puts
|
13
10
|
|
14
|
-
wf =
|
11
|
+
wf = ActivityPub.webfinger(acct)
|
15
12
|
if !wf
|
16
13
|
puts "Unable to find #{acct}"
|
17
14
|
exit(1)
|
@@ -22,35 +19,22 @@ puts
|
|
22
19
|
puts "Enter to continue"
|
23
20
|
gets
|
24
21
|
|
25
|
-
|
26
|
-
if !
|
22
|
+
href = wf.activitypub
|
23
|
+
if !href
|
27
24
|
puts "Unable to find a link to the actor"
|
28
25
|
exit(2)
|
29
26
|
end
|
30
27
|
|
31
|
-
href = link["href"]
|
32
|
-
|
33
28
|
puts "Trying to retrieve the Actor from #{href}"
|
34
29
|
puts
|
35
30
|
|
36
|
-
|
37
|
-
if response.status != 200
|
38
|
-
PP.pp response
|
39
|
-
exit(3)
|
40
|
-
end
|
41
|
-
|
42
|
-
ob = ActivityPub.from_json(response.body)
|
31
|
+
ob = href.get
|
43
32
|
PP.pp(ob)
|
33
|
+
puts ob.to_json
|
44
34
|
puts
|
45
35
|
puts "Enter to continue"
|
46
36
|
gets
|
47
37
|
|
48
38
|
puts "Trying to retrieve outbox"
|
49
|
-
|
50
|
-
if response.status != 200
|
51
|
-
PP.pp response
|
52
|
-
exit(4)
|
53
|
-
end
|
54
|
-
|
55
|
-
ob = ActivityPub.from_json(response.body)
|
39
|
+
ob = ob.outbox.get
|
56
40
|
PP.pp(ob)
|
data/lib/activitypub/base.rb
CHANGED
@@ -36,6 +36,10 @@ module ActivityPub
|
|
36
36
|
av.is_a?(Hash) && av["type"] ? from_hash(av) : av
|
37
37
|
end
|
38
38
|
end
|
39
|
+
|
40
|
+
if t = klass.ap_types[attr]
|
41
|
+
v = t.new(v)
|
42
|
+
end
|
39
43
|
ob.instance_variable_set("@#{attr}", v) if !v.nil?
|
40
44
|
end
|
41
45
|
end
|
@@ -51,12 +55,20 @@ module ActivityPub
|
|
51
55
|
def _type = self.class.name.split("::").last
|
52
56
|
|
53
57
|
|
54
|
-
|
58
|
+
# FIXME: Allow specifying a type (e.g. URI)
|
59
|
+
def self.ap_attr(name, type=nil)
|
55
60
|
@ap_attributes ||= []
|
56
|
-
@ap_attributes
|
57
|
-
|
61
|
+
@ap_attributes << name
|
62
|
+
@ap_types ||= {}
|
63
|
+
@ap_types[name] = type
|
64
|
+
attr_accessor name
|
58
65
|
end
|
59
66
|
|
67
|
+
def self.ap_types
|
68
|
+
parent = superclass.respond_to?(:ap_types) ? superclass.ap_types : {}
|
69
|
+
parent.merge(@ap_types || {})
|
70
|
+
end
|
71
|
+
|
60
72
|
def self.ap_attributes
|
61
73
|
parent = superclass.respond_to?(:ap_attributes) ? superclass.ap_attributes : []
|
62
74
|
parent.concat(@ap_attributes||[])
|
data/lib/activitypub/types.rb
CHANGED
@@ -2,23 +2,57 @@
|
|
2
2
|
# https://www.w3.org/TR/activitystreams-vocabulary/
|
3
3
|
|
4
4
|
require_relative 'base'
|
5
|
+
require_relative 'uri'
|
5
6
|
|
6
7
|
module ActivityPub
|
7
8
|
|
8
9
|
class Link < Base
|
9
|
-
ap_attr :href
|
10
|
+
ap_attr :href
|
11
|
+
ap_attr :rel
|
12
|
+
ap_attr :mediaType
|
13
|
+
ap_attr :name
|
14
|
+
ap_attr :hreflang
|
15
|
+
ap_attr :height
|
16
|
+
ap_attr :width
|
17
|
+
ap_attr :preview
|
10
18
|
end
|
11
19
|
|
12
20
|
class Object < Base
|
13
21
|
ap_attr :id
|
14
|
-
ap_attr :attachment
|
15
|
-
|
16
|
-
|
17
|
-
|
22
|
+
ap_attr :attachment
|
23
|
+
ap_attr :attributedTo
|
24
|
+
ap_attr :audience
|
25
|
+
ap_attr :content
|
26
|
+
ap_attr :context
|
27
|
+
ap_attr :name
|
28
|
+
ap_attr :endTime
|
29
|
+
ap_attr :generator
|
30
|
+
ap_attr :icon
|
31
|
+
ap_attr :image
|
32
|
+
ap_attr :inReplyTo
|
33
|
+
ap_attr :location
|
34
|
+
ap_attr :preview
|
35
|
+
ap_attr :published
|
36
|
+
ap_attr :replies
|
37
|
+
ap_attr :startTime
|
38
|
+
ap_attr :summary
|
39
|
+
ap_attr :tag
|
40
|
+
ap_attr :updated
|
41
|
+
ap_attr :url
|
42
|
+
ap_attr :to
|
43
|
+
ap_attr :bto
|
44
|
+
ap_attr :cc
|
45
|
+
ap_attr :mediaType
|
46
|
+
ap_attr :duration
|
18
47
|
end
|
19
48
|
|
20
49
|
class Activity < Object
|
21
|
-
ap_attr :actor
|
50
|
+
ap_attr :actor
|
51
|
+
ap_attr :object
|
52
|
+
ap_attr :target
|
53
|
+
ap_attr :result
|
54
|
+
ap_attr :origin
|
55
|
+
ap_attr :instrument
|
22
56
|
end
|
23
57
|
|
24
58
|
# @FIXME
|
@@ -27,7 +61,11 @@ module ActivityPub
|
|
27
61
|
end
|
28
62
|
|
29
63
|
class Collection < Object
|
30
|
-
ap_attr :totalItems
|
64
|
+
ap_attr :totalItems
|
65
|
+
ap_attr :current
|
66
|
+
ap_attr :first
|
67
|
+
ap_attr :last
|
68
|
+
ap_attr :items
|
31
69
|
end
|
32
70
|
|
33
71
|
class OrderedCollection < Collection
|
@@ -41,7 +79,9 @@ module ActivityPub
|
|
41
79
|
end
|
42
80
|
|
43
81
|
class CollectionPage < Collection
|
44
|
-
ap_attr :partOf
|
82
|
+
ap_attr :partOf
|
83
|
+
ap_attr :next
|
84
|
+
ap_attr :prev
|
45
85
|
end
|
46
86
|
|
47
87
|
class OrderedCollectionPage < CollectionPage
|
@@ -129,7 +169,9 @@ module ActivityPub
|
|
129
169
|
end
|
130
170
|
|
131
171
|
class Question < IntransitiveActivity
|
132
|
-
ap_attr :oneOf
|
172
|
+
ap_attr :oneOf
|
173
|
+
ap_attr :anyOf
|
174
|
+
ap_attr :closed
|
133
175
|
end
|
134
176
|
|
135
177
|
# ## Actor Types
|
@@ -143,20 +185,27 @@ module ActivityPub
|
|
143
185
|
# Section 4.1
|
144
186
|
|
145
187
|
# MUST have:
|
146
|
-
ap_attr :inbox,
|
188
|
+
ap_attr :inbox, URI
|
189
|
+
ap_attr :outbox, URI
|
147
190
|
|
148
191
|
# SHOULD have:
|
149
|
-
ap_attr :following
|
192
|
+
ap_attr :following
|
193
|
+
ap_attr :followers
|
150
194
|
|
151
195
|
# MAY have:
|
152
|
-
ap_attr :liked
|
153
|
-
|
196
|
+
ap_attr :liked
|
197
|
+
ap_attr :streams
|
198
|
+
ap_attr :preferredUsername
|
199
|
+
ap_attr :endpoints
|
154
200
|
|
155
201
|
|
156
202
|
# Per https://docs-p.joinmastodon.org/spec/activitypub/#extensions
|
157
203
|
# These are extensions used by Mastodon for Actor types
|
158
|
-
ap_attr :publicKey
|
159
|
-
|
204
|
+
ap_attr :publicKey
|
205
|
+
ap_attr :featured
|
206
|
+
ap_attr :featuredTags
|
207
|
+
ap_attr :discoverable
|
208
|
+
ap_attr :suspended
|
160
209
|
end
|
161
210
|
|
162
211
|
# FIXME: Add "toot:Emoji
|
@@ -172,7 +221,9 @@ module ActivityPub
|
|
172
221
|
|
173
222
|
# Mastodon extension per
|
174
223
|
# https://docs-p.joinmastodon.org/spec/activitypub/#extensions
|
175
|
-
ap_attr :likes
|
224
|
+
ap_attr :likes
|
225
|
+
ap_attr :bookmarks
|
226
|
+
ap_attr :manuallyApprovesFollowers
|
176
227
|
end
|
177
228
|
|
178
229
|
class Service < Actor
|
@@ -182,7 +233,9 @@ module ActivityPub
|
|
182
233
|
# ## Object types
|
183
234
|
|
184
235
|
class Relationship < Object
|
185
|
-
ap_attr :subject
|
236
|
+
ap_attr :subject
|
237
|
+
ap_attr :object
|
238
|
+
ap_attr :relationship
|
186
239
|
end
|
187
240
|
|
188
241
|
class Article < Object
|
@@ -198,7 +251,8 @@ module ActivityPub
|
|
198
251
|
|
199
252
|
# Mastodon extension per
|
200
253
|
# https://docs-p.joinmastodon.org/spec/activitypub/#extensions
|
201
|
-
ap_attr :focalPoint
|
254
|
+
ap_attr :focalPoint
|
255
|
+
ap_attr :blurhash
|
202
256
|
end
|
203
257
|
|
204
258
|
class Video < Document
|
@@ -223,7 +277,8 @@ module ActivityPub
|
|
223
277
|
end
|
224
278
|
|
225
279
|
class Tombstone < Object
|
226
|
-
ap_attr :formerType
|
280
|
+
ap_attr :formerType
|
281
|
+
ap_attr :deleted
|
227
282
|
end
|
228
283
|
|
229
284
|
# Mastodon extensions
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
require 'uri'
|
3
|
+
require 'faraday'
|
4
|
+
|
5
|
+
module ActivityPub
|
6
|
+
class URI
|
7
|
+
def initialize(href)
|
8
|
+
@href = href
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s = @href
|
12
|
+
def to_json(...) = @href
|
13
|
+
|
14
|
+
def get
|
15
|
+
response = Faraday.get(self.to_s, {}, {"Accept": "application/activity+json"})
|
16
|
+
if response.status == 200
|
17
|
+
ActivityPub.from_json(response.body)
|
18
|
+
else
|
19
|
+
response
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/activitypub/version.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
require 'webfinger'
|
3
|
+
|
4
|
+
module ActivityPub
|
5
|
+
class WebFingerResult
|
6
|
+
def initialize(hash)
|
7
|
+
@h = hash
|
8
|
+
|
9
|
+
@h["aliases"] = @h["aliases"].map{ ActivityPub::URI.new(_1) }
|
10
|
+
@h["links"].each do |v|
|
11
|
+
if v["href"]
|
12
|
+
v["href"] = ActivityPub::URI.new(v["href"])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def[](i) = @h[i]
|
18
|
+
|
19
|
+
def activitypub
|
20
|
+
@activitypub ||= self["links"].find{ _1["rel"] == "self" && _1["type"] == "application/activity+json" }&.dig("href")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.webfinger(acct)
|
25
|
+
WebFingerResult.new(WebFinger.discover!(acct))
|
26
|
+
end
|
27
|
+
end
|
data/lib/activitypub.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "activitypub/version"
|
4
|
+
require_relative "activitypub/base"
|
4
5
|
require_relative "activitypub/types"
|
6
|
+
require_relative "activitypub/uri"
|
7
|
+
require_relative "activitypub/webfinger"
|
5
8
|
|
6
9
|
module ActivityPub
|
7
10
|
class Error < StandardError; end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activitypub
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vidar Hokstad
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-07-
|
12
|
-
dependencies:
|
11
|
+
date: 2024-07-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: webfinger
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.1.3
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.1.3
|
13
27
|
description:
|
14
28
|
email:
|
15
29
|
- vidar@hokstad.com
|
@@ -27,7 +41,9 @@ files:
|
|
27
41
|
- lib/activitypub.rb
|
28
42
|
- lib/activitypub/base.rb
|
29
43
|
- lib/activitypub/types.rb
|
44
|
+
- lib/activitypub/uri.rb
|
30
45
|
- lib/activitypub/version.rb
|
46
|
+
- lib/activitypub/webfinger.rb
|
31
47
|
- sig/activitypub.rbs
|
32
48
|
homepage: https://github.com/vidarh/activitypub
|
33
49
|
licenses:
|