Atmosfire 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/atmosfire/at_uri.rb +32 -5
- data/lib/atmosfire/collection.rb +9 -3
- data/lib/atmosfire/record.rb +10 -9
- data/lib/atmosfire/repo.rb +9 -7
- data/lib/atmosfire/requests.rb +38 -0
- data/lib/atmosfire/session.rb +20 -0
- data/lib/atmosfire/version.rb +1 -1
- 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: a6019bf1753d127a42713023bacb28766618cbb070b4fb0d4f1014e0534c0198
|
4
|
+
data.tar.gz: b05c49f4859eb3acf8ee38a89ee325372eb6d830e9796195e54f5db23d402dde
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64f31d799ebb6158e05a7aced34b500c8e70fb34cfd25973c3fffae5e968f03d29c063e78380e38d7259b98c73d516a0b63f1d9e4df3dc86e93b420910e446c7
|
7
|
+
data.tar.gz: 73a6e7eb8cb76c6ee61ac046c4a19a2c0e9a4c7d3c2a1e6a1031df91a870dfffdfafff63cbfcff85fbebc6f943acb35abac692f18aa21bdaa8e731274926f8f4
|
data/lib/atmosfire/at_uri.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: false
|
2
2
|
|
3
3
|
module Atmosfire
|
4
4
|
module RequestUtils
|
@@ -16,7 +16,10 @@ end
|
|
16
16
|
module Atmosfire
|
17
17
|
module AtUriParser
|
18
18
|
extend T::Sig
|
19
|
-
|
19
|
+
|
20
|
+
class << self
|
21
|
+
include RequestUtils
|
22
|
+
end
|
20
23
|
|
21
24
|
Rule = Struct.new(:pattern, :transform)
|
22
25
|
|
@@ -45,10 +48,24 @@ module Atmosfire
|
|
45
48
|
AtUri.new(repo: did, collection: "app.bsky.feed.post", rkey: rkey)
|
46
49
|
end,
|
47
50
|
|
51
|
+
AtUriParser.create_rule(%r{^#{Regexp.escape("https://")}(bsky\.app)/profile/(.+)$}) do |_, handle, pds|
|
52
|
+
handle.start_with?("did:") ? did = handle : did = resolve_handle(handle, pds)
|
53
|
+
AtUri.new(repo: did)
|
54
|
+
end,
|
55
|
+
|
48
56
|
AtUriParser.create_rule(%r{^at://(.+)/(.+)/(\w+)$}) do |handle, collection, rkey, pds|
|
49
57
|
handle.start_with?("did:") ? did = handle : did = resolve_handle(handle, pds)
|
50
58
|
AtUri.new(repo: did, collection: collection, rkey: rkey)
|
51
59
|
end,
|
60
|
+
AtUriParser.create_rule(%r{^at://(.+)/(.+)$}) do |handle, collection, pds|
|
61
|
+
handle.start_with?("did:") ? did = handle : did = resolve_handle(handle, pds)
|
62
|
+
AtUri.new(repo: did, collection: collection)
|
63
|
+
end,
|
64
|
+
AtUriParser.create_rule(%r{^at://(.+)$}) do |handle, pds|
|
65
|
+
handle.start_with?("did:") ? did = handle : did = resolve_handle(handle, pds)
|
66
|
+
AtUri.new(repo: did)
|
67
|
+
end,
|
68
|
+
|
52
69
|
]
|
53
70
|
end
|
54
71
|
|
@@ -58,10 +75,20 @@ module Atmosfire
|
|
58
75
|
const :collection, T.nilable(T.any(Atmosfire::Repo::Collection, String))
|
59
76
|
const :rkey, T.nilable(String)
|
60
77
|
|
61
|
-
|
78
|
+
def resolve(pds: "https://bsky.social")
|
79
|
+
if @collection.nil?
|
80
|
+
Repo.new(@repo.to_s, pds)
|
81
|
+
elsif @rkey.nil?
|
82
|
+
Repo::Collection.new(Repo.new(@repo.to_s, pds), @collection.to_s, pds)
|
83
|
+
else
|
84
|
+
Record.from_uri(self, pds)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
sig { params(pds: String).returns(String) }
|
62
89
|
|
63
|
-
def to_s
|
64
|
-
|
90
|
+
def to_s(pds: "https://bsky.social")
|
91
|
+
self.resolve(pds: pds).to_uri
|
65
92
|
end
|
66
93
|
end
|
67
94
|
end
|
data/lib/atmosfire/collection.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: true
|
2
2
|
module Atmosfire
|
3
3
|
class Repo
|
4
4
|
class Collection < T::Struct
|
@@ -11,7 +11,7 @@ module Atmosfire
|
|
11
11
|
sig { params(limit: Integer).returns(T::Array[Atmosfire::Record]) }
|
12
12
|
|
13
13
|
def list(limit = 10)
|
14
|
-
self.repo.
|
14
|
+
self.repo.xrpc
|
15
15
|
.get.com_atproto_repo_listRecords(
|
16
16
|
repo: self.repo.did,
|
17
17
|
collection: self.collection,
|
@@ -22,10 +22,16 @@ module Atmosfire
|
|
22
22
|
}
|
23
23
|
end
|
24
24
|
|
25
|
+
def list_all()
|
26
|
+
T.must(get_paginated_data(self.repo, :com_atproto_repo_listRecords.to_s, key: "records", params: { repo: self.repo.to_s, collection: self.to_s }, cursor: nil) do |record|
|
27
|
+
Atmosfire::Record.from_hash(record)
|
28
|
+
end)
|
29
|
+
end
|
30
|
+
|
25
31
|
sig { returns(String) }
|
26
32
|
|
27
33
|
def to_uri
|
28
|
-
"at://#{self.repo.did}/#{self.collection}"
|
34
|
+
"at://#{self.repo.did}/#{self.collection}/"
|
29
35
|
end
|
30
36
|
|
31
37
|
sig { returns(String) }
|
data/lib/atmosfire/record.rb
CHANGED
@@ -36,18 +36,13 @@ module Atmosfire
|
|
36
36
|
|
37
37
|
def create(content_hash, session, rkey = nil)
|
38
38
|
return nil if content_hash["$type"].nil?
|
39
|
-
|
40
|
-
from_uri(at_uri(session.xrpc.post.com_atproto_repo_createRecord(
|
41
|
-
repo: session.did,
|
42
|
-
collection: content_hash["$type"],
|
43
|
-
record: content_hash,
|
44
|
-
)["uri"]))
|
45
|
-
else from_uri(at_uri(session.xrpc.post.com_atproto_repo_createRecord(
|
39
|
+
params = {
|
46
40
|
repo: session.did,
|
47
41
|
collection: content_hash["$type"],
|
48
|
-
rkey: rkey,
|
49
42
|
record: content_hash,
|
50
|
-
|
43
|
+
}
|
44
|
+
params[:rkey] = rkey unless rkey.nil?
|
45
|
+
from_uri(at_uri(session.xrpc.post.com_atproto_repo_createRecord(params)["uri"]))
|
51
46
|
end
|
52
47
|
end
|
53
48
|
|
@@ -68,6 +63,8 @@ module Atmosfire
|
|
68
63
|
self.class.from_uri(self.uri, session.pds)
|
69
64
|
end
|
70
65
|
|
66
|
+
sig { params(session: Atmosfire::Session).returns(T.nilable(Atmosfire::Record)) }
|
67
|
+
|
71
68
|
def put(session)
|
72
69
|
session.xrpc.post.com_atproto_repo_putRecord(
|
73
70
|
repo: session.did,
|
@@ -86,5 +83,9 @@ module Atmosfire
|
|
86
83
|
rkey: self.uri.rkey,
|
87
84
|
)
|
88
85
|
end
|
86
|
+
|
87
|
+
def to_uri
|
88
|
+
"at://#{self.uri.repo}/#{self.uri.collection}/#{self.uri.rkey}"
|
89
|
+
end
|
89
90
|
end
|
90
91
|
end
|
data/lib/atmosfire/repo.rb
CHANGED
@@ -12,12 +12,12 @@ class Atmosfire::Repo
|
|
12
12
|
# @param authenticate [NilClass, Object] Additional authentication data (default: nil).
|
13
13
|
|
14
14
|
def initialize(username, pds = "https://bsky.social", open: true, authenticate: nil)
|
15
|
-
@pds = pds
|
16
|
-
@
|
15
|
+
@pds = T.let pds, String
|
16
|
+
@xrpc = T.let(XRPC::Client.new(pds), XRPC::Client)
|
17
17
|
if username.start_with?("did:")
|
18
|
-
@did = username
|
18
|
+
@did = T.let(username, String)
|
19
19
|
else
|
20
|
-
@did = resolve_handle(username, pds)
|
20
|
+
@did = T.let(resolve_handle(username, pds), String)
|
21
21
|
end
|
22
22
|
@record_list = []
|
23
23
|
if open == true
|
@@ -32,9 +32,11 @@ class Atmosfire::Repo
|
|
32
32
|
sig { returns(String) }
|
33
33
|
|
34
34
|
def to_uri
|
35
|
-
"at://#{@did}"
|
35
|
+
"at://#{@did}/"
|
36
36
|
end
|
37
37
|
|
38
|
+
sig { returns(String) }
|
39
|
+
|
38
40
|
def to_s
|
39
41
|
@did
|
40
42
|
end
|
@@ -42,7 +44,7 @@ class Atmosfire::Repo
|
|
42
44
|
sig { returns(Hash) }
|
43
45
|
|
44
46
|
def describe_repo
|
45
|
-
@
|
47
|
+
@xrpc.get.com_atproto_repo_describeRepo(repo: @did)
|
46
48
|
end
|
47
49
|
|
48
50
|
sig { returns(Hash) }
|
@@ -57,5 +59,5 @@ class Atmosfire::Repo
|
|
57
59
|
Collection.new(repo: self, collection: collection)
|
58
60
|
end
|
59
61
|
|
60
|
-
attr_reader :did, :record_list, :pds, :
|
62
|
+
attr_reader :did, :record_list, :pds, :xrpc
|
61
63
|
end
|
data/lib/atmosfire/requests.rb
CHANGED
@@ -7,6 +7,8 @@ module Atmosfire
|
|
7
7
|
class UnauthorizedError < HTTPError; end
|
8
8
|
|
9
9
|
module RequestUtils # Goal is to replace with pure XRPC eventually
|
10
|
+
extend T::Sig
|
11
|
+
|
10
12
|
def resolve_handle(username, pds = "https://bsky.social")
|
11
13
|
(XRPC::Client.new(pds).get.com_atproto_identity_resolveHandle(handle: username))["did"]
|
12
14
|
end
|
@@ -66,5 +68,41 @@ module Atmosfire
|
|
66
68
|
Authorization: "Bearer #{session.refresh_token}",
|
67
69
|
})
|
68
70
|
end
|
71
|
+
|
72
|
+
sig {
|
73
|
+
params(
|
74
|
+
session: T.any(Atmosfire::Session, Atmosfire::Repo),
|
75
|
+
method: String,
|
76
|
+
key: String,
|
77
|
+
params: Hash,
|
78
|
+
cursor: T.nilable(
|
79
|
+
String
|
80
|
+
),
|
81
|
+
map_block: T.nilable(Proc),
|
82
|
+
)
|
83
|
+
.returns(T
|
84
|
+
.nilable(
|
85
|
+
Array
|
86
|
+
))
|
87
|
+
}
|
88
|
+
|
89
|
+
def get_paginated_data(session, method, key:, params:, cursor: nil, &map_block)
|
90
|
+
(send_data = (params.merge({ :limit => 100, :cursor => cursor })))
|
91
|
+
response = session.xrpc.get.public_send(method, **send_data)
|
92
|
+
data = response.dig(key)
|
93
|
+
|
94
|
+
if data.nil? || data.empty?
|
95
|
+
return []
|
96
|
+
end
|
97
|
+
|
98
|
+
results = block_given? ? data.map(&map_block) : data
|
99
|
+
next_cursor = T.let(response.dig("cursor"), T.nilable(String))
|
100
|
+
|
101
|
+
if next_cursor.nil?
|
102
|
+
return results
|
103
|
+
else
|
104
|
+
return results + get_paginated_data(session, method, key: key, params: params, cursor: next_cursor, &map_block)
|
105
|
+
end
|
106
|
+
end
|
69
107
|
end
|
70
108
|
end
|
data/lib/atmosfire/session.rb
CHANGED
@@ -45,6 +45,8 @@ module Atmosfire
|
|
45
45
|
raise UnauthorizedError if response["accessJwt"].nil?
|
46
46
|
@access_token = response["accessJwt"]
|
47
47
|
@refresh_token = response["refreshJwt"]
|
48
|
+
@xrpc = XRPC::Client.new(@pds, @access_token)
|
49
|
+
@refresher = XRPC::Client.new(@pds, @refresh_token)
|
48
50
|
end
|
49
51
|
|
50
52
|
sig { returns(T.nilable(Hash)) }
|
@@ -66,3 +68,21 @@ module Atmosfire
|
|
66
68
|
end
|
67
69
|
end
|
68
70
|
end
|
71
|
+
|
72
|
+
module Atmosfire
|
73
|
+
class TokenSession < Session
|
74
|
+
extend T::Sig
|
75
|
+
|
76
|
+
sig { params(token: String, pds: String).void }
|
77
|
+
|
78
|
+
def initialize(token, pds = "https://bsky.social")
|
79
|
+
@token = token
|
80
|
+
@pds = pds
|
81
|
+
open!
|
82
|
+
end
|
83
|
+
|
84
|
+
def open!
|
85
|
+
@xrpc = XRPC::Client.new(@pds, @token)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/lib/atmosfire/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Atmosfire
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shreyan Jain
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-07-
|
12
|
+
date: 2023-07-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: xrpc
|