urbit-api 0.4.0 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d45d05923c175955a85dfb0676a63eafc0eed277b656b7d045f8675f586cee7e
4
- data.tar.gz: e2bc0d8d71d02629b9b3f335ff1672f20686c178e1584540ff1724943d82158c
3
+ metadata.gz: a306b64d165415e7a680fd82a20b75de6840ca80d9482be6ceacbd13fd2b4a9f
4
+ data.tar.gz: 81ce508aee55fd9cdee15bb56774adf5f226b7f5620d9430f4be8de73cb307f9
5
5
  SHA512:
6
- metadata.gz: 86e48b8bae4f5cedfbe9ca0fcb4ac327185973ce73e29c8a26f7644fadb2e8f78850b9f1cca9d62802d22c45afdeb025b8d495e14d54bf642f123f66f986a1c5
7
- data.tar.gz: 20968fc224c1e4fd6105922a4ddc30b16f45f25a12f2c5e4294eaec33f7d379db8180720b062a3d274755853468c7e61af823401ec2a4f5b3e800be3f1de497f
6
+ metadata.gz: 1cfffd8c6a8f82d701ace0b49266036f17bc481ea75d799d871e7d785899771686d6682a5444a1a20d3b167d7b5415ef4d05b18baa2dc1553000719055b5ca58
7
+ data.tar.gz: 561e7976cf6d5b5c07e224079e53f6a6102214d317050fd16d1eb5639befb41b020f88ff50b18a94ffda31eaf85515408e5e85bbf38b3610d59e141c02dfb3de
@@ -9,8 +9,6 @@ module Urbit
9
9
  @channel = channel
10
10
  @data = event.data
11
11
  @type = event.type
12
- # TODO: Remove this debugging once Facts are finalized. DJR 2/3/2022
13
- # puts "Received a #{self.class.name.split('::').last} for [#{channel}] -- [#{@type}] -- [#{@data}]"
14
12
  end
15
13
 
16
14
  def add_ack(ack:)
@@ -11,9 +11,7 @@ module Urbit
11
11
  # Attach this new fact as a node to its Graph.
12
12
  #
13
13
  def attach_parser
14
- # puts "Received a graph update for [#{self.ship.graph(resource: self.resource)}]"
15
14
  if self.incoming_graph
16
- # puts "Received an add_graph event: #{self.raw_json} on #{self.resource}"
17
15
  self.create_parser
18
16
  end
19
17
  end
@@ -49,7 +47,7 @@ module Urbit
49
47
  end
50
48
 
51
49
  def create_parser
52
- Urbit::AddGraphParser.new(for_graph: incoming_graph, with_json: self.raw_json).add_nodes
50
+ Urbit::AddGraphParser.new(for_graph: self.incoming_graph, with_json: self.raw_json).add_nodes
53
51
  end
54
52
 
55
53
  def raw_json
@@ -63,7 +61,7 @@ module Urbit
63
61
  end
64
62
 
65
63
  def create_parser
66
- Urbit::AddNodesParser.new(for_graph: incoming_graph, with_json: self.raw_json).add_nodes
64
+ Urbit::AddNodesParser.new(for_graph: self.incoming_graph, with_json: self.raw_json).add_nodes
67
65
  end
68
66
 
69
67
  def raw_json
@@ -77,7 +75,7 @@ module Urbit
77
75
  end
78
76
 
79
77
  def create_parser
80
- Urbit::RemoveGraphParser.new(for_graph: incoming_graph, with_json: self.raw_json)
78
+ Urbit::RemoveGraphParser.new(for_graph: self.incoming_graph, with_json: self.raw_json)
81
79
  end
82
80
 
83
81
  def raw_json
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../link.rb'
4
+
5
+ module Urbit
6
+ module Fact
7
+ class MetadataUpdateFact < BaseFact
8
+ def initialize(channel:, event:)
9
+ super channel: channel, event: event
10
+ unless self.is_remove
11
+ self.accept if self.for_this_ship?
12
+ end
13
+ # TODO: Remove this debugging once Facts are finalized. DJR 2/3/2022
14
+ # puts "Received a #{self.class.name.split('::').last} for [#{channel}] -- [#{@type}] -- [#{@data}]"
15
+ end
16
+
17
+ def accept
18
+ links = self.channel.ship.links
19
+ if self.add_root.nil?
20
+ # This is an new incoming Link, add it. If its a dupe, the Links Set will filter it.
21
+ self.associations.each do |k, v|
22
+ links << Link.new(chain: links, path: k, data: v)
23
+ end
24
+ else
25
+ g = self.add_root["group"]
26
+ links << Link.new(chain: links, path: "#{g}/groups#{g}", data: self.add_root)
27
+ end
28
+ nil
29
+ end
30
+
31
+ def add_root
32
+ self.root_h["add"]
33
+ end
34
+
35
+ def associations
36
+ # An ugly hacks around the fact that when you first join a group there is another
37
+ # useless "initial-update" enclosing hash.
38
+ unless (a = self.root_h["associations"])
39
+ return self.root_h["initial-group"]["associations"]
40
+ end
41
+ a
42
+ end
43
+
44
+ def is_remove
45
+ self.root_h["remove"]
46
+ end
47
+
48
+ def root_h
49
+ self.contents["json"]["metadata-update"]
50
+ end
51
+
52
+ def to_h
53
+ super.merge!(resource: self.resource)
54
+ end
55
+ end
56
+ end
57
+ end
data/lib/urbit/fact.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require_relative 'fact/base_fact'
4
4
  require_relative 'fact/graph_fact'
5
5
  require_relative 'fact/group_fact'
6
+ require_relative 'fact/metadata_fact'
6
7
  require_relative 'fact/settings_fact'
7
8
 
8
9
  module Urbit
@@ -36,6 +37,10 @@ module Urbit
36
37
  return RemoveTagFact.new(channel: channel, event: event) if c["removeTag"]
37
38
  end
38
39
 
40
+ if (c = contents["json"]["metadata-update"])
41
+ return MetadataUpdateFact.new(channel: channel, event: event) if contents["json"]["metadata-update"]
42
+ end
43
+
39
44
  if (c = contents["json"]["settings-event"])
40
45
  return SettingsEventDelBucketFact.new(channel: channel, event: event) if c["del-bucket"]
41
46
  return SettingsEventDelEntryFact.new(channel: channel, event: event) if c["del-entry"]
data/lib/urbit/graph.rb CHANGED
@@ -4,12 +4,13 @@ require 'urbit/parser'
4
4
 
5
5
  module Urbit
6
6
  class Graph
7
- attr_reader :host_ship_name, :name, :ship
7
+ attr_reader :host_ship_name, :name, :ship
8
8
 
9
9
  def initialize(ship:, graph_name:, host_ship_name:)
10
10
  @ship = ship
11
- @name = graph_name
11
+ @group = nil
12
12
  @host_ship_name = host_ship_name
13
+ @name = graph_name
13
14
  @nodes = SortedSet.new
14
15
  end
15
16
 
@@ -17,6 +18,28 @@ module Urbit
17
18
  @nodes << node unless node.deleted?
18
19
  end
19
20
 
21
+ def creator
22
+ self.fetch_link if @creator.nil?
23
+ @creator
24
+ end
25
+
26
+ def description
27
+ self.fetch_link if @description.nil?
28
+ @description
29
+ end
30
+
31
+ def group
32
+ if @group.nil?
33
+ @link = self.fetch_link
34
+ @group = @link.group unless @link.nil?
35
+ end
36
+ @group
37
+ end
38
+
39
+ def group=(a_group)
40
+ @group = a_group
41
+ end
42
+
20
43
  def host_ship
21
44
  "~#{@host_ship_name}"
22
45
  end
@@ -84,6 +107,16 @@ module Urbit
84
107
  self.fetch_sibling_nodes(node, :older, count)[0..(count - 1)]
85
108
  end
86
109
 
110
+ def title
111
+ self.fetch_link if @title.nil?
112
+ @title
113
+ end
114
+
115
+ def type
116
+ self.fetch_link if @type.nil?
117
+ @type
118
+ end
119
+
87
120
  #
88
121
  # the canonical printed representation of a Graph
89
122
  def to_s
@@ -98,6 +131,15 @@ module Urbit
98
131
  "add-graph")
99
132
  end
100
133
 
134
+ def fetch_link
135
+ @link = self.ship.links.find_graph(resource: self.resource)
136
+ @creator = @link.metadata['creator']
137
+ @description = @link.metadata['description']
138
+ @title = @link.metadata['title']
139
+ @type = @link.metadata['config']['graph']
140
+ @link
141
+ end
142
+
101
143
  def fetch_newest_nodes(count)
102
144
  self.fetch_nodes("#{self.graph_resource}/node/siblings/newest/kith/#{count}/",
103
145
  AddNodesParser,
data/lib/urbit/group.rb CHANGED
@@ -2,10 +2,11 @@
2
2
 
3
3
  module Urbit
4
4
  class Group
5
- attr_accessor :manager, :members, :tags
5
+ attr_accessor :graphs, :manager, :members, :tags, :title
6
6
  attr_reader :hidden, :path, :policy
7
7
 
8
8
  def initialize(path:, members:, policy:, tags:, hidden:)
9
+ @graphs = Set.new
9
10
  @hidden = hidden
10
11
  @manager = nil
11
12
  @members = Set.new(members)
@@ -22,6 +23,16 @@ module Urbit
22
23
  self.path <=> another_group.path
23
24
  end
24
25
 
26
+ def creator
27
+ self.fetch_link if @creator.nil?
28
+ @creator
29
+ end
30
+
31
+ def description
32
+ self.fetch_link if @description.nil?
33
+ @description
34
+ end
35
+
25
36
  #
26
37
  # This is the action labeled as "Archive" in the Landscape UI.
27
38
  # As of now, you can only do this to groups on your own ship.
@@ -39,6 +50,13 @@ module Urbit
39
50
  another_group.path == self.path
40
51
  end
41
52
 
53
+ def graphs
54
+ if @graphs.empty?
55
+ self.graph_links.each {|gl| @graphs << gl.graph}
56
+ end
57
+ @graphs
58
+ end
59
+
42
60
  def host
43
61
  self.path_tokens[0]
44
62
  end
@@ -82,8 +100,20 @@ module Urbit
82
100
  '?'
83
101
  end
84
102
 
103
+ def picture
104
+ self.fetch_link if @picture.nil?
105
+ @picture
106
+ end
107
+
108
+ def title
109
+ self.fetch_link if @title.nil?
110
+ @title
111
+ end
112
+
85
113
  def to_h
86
114
  {
115
+ title: self.title,
116
+ description: self.description,
87
117
  host: self.host,
88
118
  key: self.key,
89
119
  member_count: self.members.count,
@@ -92,12 +122,37 @@ module Urbit
92
122
  }
93
123
  end
94
124
 
125
+ def to_list
126
+ self.title || "Untitled - #{self.path}"
127
+ end
128
+
95
129
  def to_s
96
130
  "a Group(#{self.to_h})"
97
131
  end
98
132
 
99
133
  private
100
134
 
135
+ def fetch_link
136
+ @group_link = self.manager.ship.links.find_group(path: self.path)
137
+ unless @group_link.nil?
138
+ @creator = @group_link.metadata['creator']
139
+ @description = @group_link.metadata['description']
140
+ @picture = @group_link.metadata['picture']
141
+ @title = @group_link.metadata['title']
142
+ end
143
+ end
144
+
145
+ def graph_links
146
+ self.group_link.graph_links
147
+ end
148
+
149
+ def group_link
150
+ if @group_link.nil?
151
+ self.fetch_link
152
+ end
153
+ @group_link
154
+ end
155
+
101
156
  def parse_tags(tags)
102
157
  h = {}
103
158
  return h if tags.empty?
@@ -1,29 +1,45 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Urbit
4
- class GroupManager
5
- attr_accessor :groups, :ship
4
+ class Groups < Set
5
+ attr_accessor :ship
6
6
 
7
7
  def initialize(ship:)
8
8
  @ship = ship
9
- @groups = []
9
+ @hash = {}
10
+ end
11
+
12
+ def [](path: nil, title: nil)
13
+ if title.nil?
14
+ if (g = self.select {|g| g.path == path}.first)
15
+ g.manager = self
16
+ return g
17
+ end
18
+ else
19
+ if (g = self.select {|g| g.title == title}.first)
20
+ g.manager = self
21
+ return g
22
+ end
23
+ end
24
+ nil
10
25
  end
11
26
 
12
27
  #
13
28
  # Adds a Group to this Manager's groups collection
14
29
  #
15
30
  def add(a_group)
16
- @groups << a_group
31
+ a_group.manager = self
32
+ self << a_group
17
33
  end
18
34
 
19
35
  def add_members(group_path:, ships:)
20
- if (group = self.find(path: group_path))
36
+ if (group = self[path: group_path])
21
37
  group.members += ships
22
38
  end
23
39
  end
24
40
 
25
41
  def add_tag(group_path:, ships:, tag:)
26
- if (group = self.find(path: group_path))
42
+ if (group = self[path: group_path])
27
43
  if (group.tags.include? tag)
28
44
  group.tags[tag] += ships
29
45
  end
@@ -35,23 +51,7 @@ module Urbit
35
51
  end
36
52
 
37
53
  def empty?
38
- self.groups.empty?
39
- end
40
-
41
- #
42
- # Answers the Group uniquely keyed by path:, if it exists
43
- #
44
- def find(path:)
45
- if (g = self.groups.select {|g| g.path == path}.first)
46
- g.manager = self
47
- g
48
- end
49
- end
50
-
51
- def first
52
- g = self.groups.first
53
- g.manager = self
54
- g
54
+ self.empty?
55
55
  end
56
56
 
57
57
  def join(host:, name:, share_contact: false, auto_join: false)
@@ -61,21 +61,21 @@ module Urbit
61
61
  end
62
62
 
63
63
  def list
64
- self.groups.map {|g| g.path}.join("\n")
64
+ self.map {|g| g.to_list}.join("\n")
65
65
  end
66
66
 
67
67
  def remove(group)
68
- @groups = self.groups.filter {|g| g != group}
68
+ self.delete(group)
69
69
  end
70
70
 
71
71
  def remove_members(group_path:, ships:)
72
- if (group = self.find(path: group_path))
72
+ if (group = self[path: group_path])
73
73
  group.members -= ships
74
74
  end
75
75
  end
76
76
 
77
77
  def remove_tag(group_path:, ships:, tag:)
78
- if (group = self.find(path: group_path))
78
+ if (group = self[path: group_path])
79
79
  if (group.tags.include? tag)
80
80
  group.tags[tag] -= ships
81
81
  end
@@ -94,7 +94,7 @@ module Urbit
94
94
  end
95
95
 
96
96
  def to_s
97
- self.groups.sort.each {|g| puts g}
97
+ self.sort.each {|g| puts g}
98
98
  end
99
99
  end
100
100
  end
data/lib/urbit/link.rb ADDED
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Urbit
4
+ class Link
5
+ attr_reader :path, :data
6
+
7
+ def initialize(chain:, path:, data:)
8
+ @chain = chain
9
+ @graph = nil
10
+ @group = nil
11
+ @path = path
12
+ @data = data
13
+ end
14
+
15
+ def ==(another)
16
+ another.path == self.path
17
+ end
18
+
19
+ def <=>(another)
20
+ self.path <=> another.path
21
+ end
22
+
23
+ def eql?(another)
24
+ another.path == self.path
25
+ end
26
+
27
+ def graph
28
+ if @graph.nil?
29
+ @graph = self.ship.graph(resource: self.graph_resource)
30
+ end
31
+ @graph
32
+ end
33
+
34
+ def graph_links
35
+ @chain.find_graph_links_for_group(path: self.group_path)
36
+ end
37
+
38
+ def graph_resource
39
+ @data['resource'].sub('/ship/', '')
40
+ end
41
+
42
+ def group
43
+ if @group.nil?
44
+ @group = self.ship.groups[path: self.group_path]
45
+ end
46
+ @group
47
+ end
48
+
49
+ def group_path
50
+ @data['group'].sub('/ship/', '')
51
+ end
52
+
53
+ def metadata
54
+ @data['metadata']
55
+ end
56
+
57
+ def ship
58
+ @chain.ship
59
+ end
60
+
61
+ def to_list
62
+ @path
63
+ end
64
+
65
+ def type
66
+ @data['app-name']
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Urbit
4
+ class Links < Set
5
+ attr_reader :ship
6
+
7
+ def initialize
8
+ @hash = {}
9
+ @ship = nil
10
+ end
11
+
12
+ def [](path:)
13
+ self.select {|l| path == l.path}.first
14
+ end
15
+
16
+ def find_graph(resource:)
17
+ self.select{|l| l.type == 'graph' && resource == l.graph_resource}.first
18
+ end
19
+
20
+ def find_graph_links_for_group(path:)
21
+ self.select{|l| l.type == 'graph' && path == l.group_path}
22
+ end
23
+
24
+ def find_group(path:)
25
+ self.select{|l| l.type == 'groups' && path == l.group_path}.first
26
+ end
27
+
28
+ def list
29
+ self.sort.each {|l| puts l.to_list}
30
+ nil
31
+ end
32
+
33
+ def load(ship:)
34
+ ship.subscribe(app: 'metadata-store', path: '/all')
35
+ @ship = ship
36
+ nil
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'urbit/bucket'
4
+
5
+ module Urbit
6
+ class Setting
7
+ attr_accessor :buckets
8
+ attr_reader :desk, :ship
9
+
10
+ def initialize(ship:, desk:, buckets:)
11
+ @ship = ship
12
+ @desk = desk
13
+ @buckets = Set.new
14
+ buckets.each {|k, v| @buckets << Bucket.new(setting: self, name: k, entries: v)}
15
+ end
16
+
17
+ def ==(another_group)
18
+ another_setting.desk == self.desk
19
+ end
20
+
21
+ def <=>(another_group)
22
+ self.desk <=> another_group.desk
23
+ end
24
+
25
+ def [](bucket:)
26
+ self.buckets.select {|b| bucket == b.name}.first
27
+ end
28
+
29
+ def add_bucket(name:, entries:)
30
+ msg = {
31
+ "put-bucket": {
32
+ "bucket-key": "#{name}",
33
+ "desk": "#{self.desk}",
34
+ "bucket": entries
35
+ }
36
+ }
37
+ self.ship.poke(app: 'settings-store', mark: 'settings-event', message: msg)
38
+ nil
39
+ end
40
+
41
+ def entries(bucket:)
42
+ self[bucket: bucket].entries
43
+ end
44
+
45
+ def remove_bucket(name:)
46
+ msg = {
47
+ "del-bucket": {
48
+ "bucket-key": "#{name}",
49
+ "desk": "#{self.desk}"
50
+ }
51
+ }
52
+ self.ship.poke(app: 'settings-store', mark: 'settings-event', message: msg)
53
+ nil
54
+ end
55
+
56
+ def to_h
57
+ {
58
+ desk: @desk,
59
+ buckets: self.buckets,
60
+ }
61
+ end
62
+
63
+ def to_s
64
+ "a Setting(#{self.to_h})"
65
+ end
66
+
67
+ def to_string
68
+ "desk: #{self.desk}\n buckets: #{self.buckets.collect {|b| b.to_string}}"
69
+ end
70
+ end
71
+ end
@@ -1,74 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'urbit/bucket'
3
+ require 'urbit/setting'
4
4
 
5
5
  module Urbit
6
- class Setting
7
- attr_accessor :buckets
8
- attr_reader :desk, :ship
9
-
10
- def initialize(ship:, desk:, buckets:)
11
- @ship = ship
12
- @desk = desk
13
- @buckets = Set.new
14
- buckets.each {|k, v| @buckets << Bucket.new(setting: self, name: k, entries: v)}
15
- end
16
-
17
- def ==(another_group)
18
- another_setting.desk == self.desk
19
- end
20
-
21
- def <=>(another_group)
22
- self.desk <=> another_group.desk
23
- end
24
-
25
- def [](bucket:)
26
- self.buckets.select {|b| bucket == b.name}.first
27
- end
28
-
29
- def add_bucket(name:, entries:)
30
- msg = {
31
- "put-bucket": {
32
- "bucket-key": "#{name}",
33
- "desk": "#{self.desk}",
34
- "bucket": entries
35
- }
36
- }
37
- self.ship.poke(app: 'settings-store', mark: 'settings-event', message: msg)
38
- nil
39
- end
40
-
41
- def entries(bucket:)
42
- self[bucket: bucket].entries
43
- end
44
-
45
- def remove_bucket(name:)
46
- msg = {
47
- "del-bucket": {
48
- "bucket-key": "#{name}",
49
- "desk": "#{self.desk}"
50
- }
51
- }
52
- self.ship.poke(app: 'settings-store', mark: 'settings-event', message: msg)
53
- nil
54
- end
55
-
56
- def to_h
57
- {
58
- desk: @desk,
59
- buckets: self.buckets,
60
- }
61
- end
62
-
63
- def to_s
64
- "a Setting(#{self.to_h})"
65
- end
66
-
67
- def to_string
68
- "desk: #{self.desk}\n buckets: #{self.buckets.collect {|b| b.to_string}}"
69
- end
70
- end
71
-
72
6
  class Settings < Set
73
7
  class << self
74
8
  def load(ship:)
@@ -99,5 +33,4 @@ module Urbit
99
33
  nil
100
34
  end
101
35
  end
102
-
103
36
  end
data/lib/urbit/ship.rb CHANGED
@@ -3,20 +3,22 @@ require 'faraday'
3
3
  require 'urbit/channel'
4
4
  require 'urbit/config'
5
5
  require 'urbit/graph'
6
- require 'urbit/group_manager'
6
+ require 'urbit/groups'
7
+ require 'urbit/links'
7
8
  require 'urbit/settings'
8
9
 
9
10
  module Urbit
10
11
  class Ship
11
12
  attr_accessor :logged_in
12
- attr_reader :auth_cookie, :channels, :config, :group_mgr
13
+ attr_reader :auth_cookie, :channels, :config
13
14
 
14
15
  def initialize(config: Config.new)
15
16
  @auth_cookie = nil
16
17
  @channels = []
17
18
  @config = config
18
19
  @graphs = []
19
- @group_mgr = GroupManager.new ship: self
20
+ @groups = Groups.new ship: self
21
+ @links = Links.new
20
22
  @settings = nil # Use lazy initialization here
21
23
  @logged_in = false
22
24
  end
@@ -41,7 +43,7 @@ module Urbit
41
43
  # Answers a collection of all the top-level graphs on this ship.
42
44
  # This collection is cached and will need to be invalidated to discover new graphs.
43
45
  #
44
- def graphs(flush_cache: false)
46
+ def graphs(flush_cache: true)
45
47
  @graphs = [] if flush_cache
46
48
  if @graphs.empty?
47
49
  if self.logged_in?
@@ -64,19 +66,16 @@ module Urbit
64
66
  self.graphs.collect {|g| g.resource}
65
67
  end
66
68
 
67
- #
68
- # Answers the Group uniquely keyed by path:, if it exists
69
- #
70
- def group(path:)
71
- @group_mgr.find_by_path(path)
72
- end
73
-
74
69
  #
75
70
  # Answers the object managing the Groups on this ship.
76
71
  # This object provides all the helper methods to list, join, leave, &c. a Group
77
72
  #
78
73
  def groups
79
- @group_mgr
74
+ @groups
75
+ end
76
+
77
+ def links
78
+ @links
80
79
  end
81
80
 
82
81
  def login
@@ -85,7 +84,14 @@ module Urbit
85
84
  ensure_connections_closed
86
85
  response = Faraday.post(login_url, "password=#{config.code}")
87
86
  parse_cookie(response)
88
- @group_mgr.load
87
+ @groups.load
88
+
89
+ # For now we will require a subscription to all metadata. it's the glue between %graphs and %groups.
90
+ # A key issue that arose is that these are both async %subscribe calls and so there are sync issues
91
+ # if we try to directly link the groups and the graphs. Instead we need to just store the links
92
+ # and lazy-instatiate the metadata _if_ we have received it.
93
+ @links.load ship: self
94
+
89
95
  self
90
96
  end
91
97
 
data/lib/urbit/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Urbit
4
- VERSION = "0.4.0"
4
+ VERSION = "0.5.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: urbit-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daryl Richter
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-18 00:00:00.000000000 Z
11
+ date: 2022-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -99,16 +99,20 @@ files:
99
99
  - lib/urbit/fact/base_fact.rb
100
100
  - lib/urbit/fact/graph_fact.rb
101
101
  - lib/urbit/fact/group_fact.rb
102
+ - lib/urbit/fact/metadata_fact.rb
102
103
  - lib/urbit/fact/settings_fact.rb
103
104
  - lib/urbit/graph.rb
104
105
  - lib/urbit/group.rb
105
- - lib/urbit/group_manager.rb
106
106
  - lib/urbit/group_parser.rb
107
+ - lib/urbit/groups.rb
108
+ - lib/urbit/link.rb
109
+ - lib/urbit/links.rb
107
110
  - lib/urbit/message.rb
108
111
  - lib/urbit/node.rb
109
112
  - lib/urbit/parser.rb
110
113
  - lib/urbit/poke_message.rb
111
114
  - lib/urbit/receiver.rb
115
+ - lib/urbit/setting.rb
112
116
  - lib/urbit/settings.rb
113
117
  - lib/urbit/ship.rb
114
118
  - lib/urbit/subscribe_message.rb