urbit-api 0.2.0 → 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.
data/lib/urbit/ship.rb CHANGED
@@ -3,17 +3,21 @@ require 'faraday'
3
3
  require 'urbit/channel'
4
4
  require 'urbit/config'
5
5
  require 'urbit/graph'
6
+ require 'urbit/group_manager'
7
+ require 'urbit/settings'
6
8
 
7
9
  module Urbit
8
10
  class Ship
9
11
  attr_accessor :logged_in
10
- attr_reader :auth_cookie, :channels, :config
12
+ attr_reader :auth_cookie, :channels, :config, :group_mgr
11
13
 
12
14
  def initialize(config: Config.new)
13
15
  @auth_cookie = nil
14
16
  @channels = []
15
17
  @config = config
16
18
  @graphs = []
19
+ @group_mgr = GroupManager.new ship: self
20
+ @settings = nil # Use lazy initialization here
17
21
  @logged_in = false
18
22
  end
19
23
 
@@ -60,12 +64,28 @@ module Urbit
60
64
  self.graphs.collect {|g| g.resource}
61
65
  end
62
66
 
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
+ #
75
+ # Answers the object managing the Groups on this ship.
76
+ # This object provides all the helper methods to list, join, leave, &c. a Group
77
+ #
78
+ def groups
79
+ @group_mgr
80
+ end
81
+
63
82
  def login
64
83
  return self if logged_in?
65
84
 
66
85
  ensure_connections_closed
67
86
  response = Faraday.post(login_url, "password=#{config.code}")
68
87
  parse_cookie(response)
88
+ @group_mgr.load
69
89
  self
70
90
  end
71
91
 
@@ -73,35 +93,14 @@ module Urbit
73
93
  config.name
74
94
  end
75
95
 
76
- def remove_graph(graph:)
77
- delete_json = %Q({
78
- "delete": {
79
- "resource": {
80
- "ship": "#{self.name}",
81
- "name": "#{graph.name}"
82
- }
83
- }
84
- })
85
-
86
- spider = self.spider(mark_in: 'graph-view-action', mark_out: 'json', thread: 'graph-delete', data: delete_json, args: ["NO_RESPONSE"])
87
- if (retcode = (200 == spider[:status]))
88
- self.graphs.delete graph
89
- end
90
- retcode
91
- end
92
-
93
- def untilded_name
94
- name.gsub('~', '')
96
+ def open_channels
97
+ @channels.select {|c| c.open?}
95
98
  end
96
99
 
97
100
  def pat_p
98
101
  config.name
99
102
  end
100
103
 
101
- def open_channels
102
- @channels.select {|c| c.open?}
103
- end
104
-
105
104
  #
106
105
  # Poke an app with a message using a mark.
107
106
  #
@@ -112,10 +111,27 @@ module Urbit
112
111
  (self.add_channel).poke(app: app, mark: mark, message: message)
113
112
  end
114
113
 
114
+ def remove_graph(desk: 'landscape', graph:)
115
+ delete_json = %Q({
116
+ "delete": {
117
+ "resource": {
118
+ "ship": "#{self.name}",
119
+ "name": "#{graph.name}"
120
+ }
121
+ }
122
+ })
123
+
124
+ spider = self.spider(desk: desk, mark_in: 'graph-view-action', mark_out: 'json', thread: 'graph-delete', data: delete_json, args: ["NO_RESPONSE"])
125
+ if (retcode = (200 == spider[:status]))
126
+ self.graphs.delete graph
127
+ end
128
+ retcode
129
+ end
130
+
115
131
  def scry(app:, path:, mark: 'json')
116
132
  self.login
117
133
  mark = ".#{mark}" unless mark.empty?
118
- scry_url = "#{self.config.api_base_url}/~/scry/#{app}#{path}#{mark}"
134
+ scry_url = "#{self.url}/~/scry/#{app}#{path}#{mark}"
119
135
 
120
136
  response = Faraday.get(scry_url) do |req|
121
137
  req.headers['Accept'] = 'application/json'
@@ -125,9 +141,20 @@ module Urbit
125
141
  {status: response.status, code: response.reason_phrase, body: response.body}
126
142
  end
127
143
 
128
- def spider(mark_in:, mark_out:, thread:, data:, args: [])
144
+ #
145
+ # Answers the object managing the Settings on this ship.
146
+ # This object provides all the helper methods to list, update, and remove a Setting
147
+ #
148
+ def settings
149
+ if self.logged_in?
150
+ @settings = Settings.load(ship: self) if @settings.nil?
151
+ end
152
+ @settings
153
+ end
154
+
155
+ def spider(desk: 'landscape', mark_in:, mark_out:, thread:, data:, args: [])
129
156
  self.login
130
- url = "#{self.config.api_base_url}/spider/#{mark_in}/#{thread}/#{mark_out}.json"
157
+ url = "#{self.url}/spider/#{desk}/#{mark_in}/#{thread}/#{mark_out}.json"
131
158
 
132
159
  # TODO: This is a huge hack due to the fact that certain spider operations are known to
133
160
  # not return when they should. Instead I just set the timeout low and catch the
@@ -175,6 +202,14 @@ module Urbit
175
202
  "a Ship(#{self.to_h})"
176
203
  end
177
204
 
205
+ def untilded_name
206
+ name.gsub('~', '')
207
+ end
208
+
209
+ def url
210
+ self.config.api_base_url
211
+ end
212
+
178
213
  private
179
214
 
180
215
  def add_channel
@@ -193,7 +228,7 @@ module Urbit
193
228
  end
194
229
 
195
230
  def login_url
196
- "#{config.api_base_url}/~/login"
231
+ "#{self.url}/~/login"
197
232
  end
198
233
 
199
234
  def parse_cookie(resp)
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Urbit
4
+ VERSION = "0.4.0"
5
+ end
@@ -1,5 +1,6 @@
1
- require_relative './config'
2
- require_relative './ship'
1
+ require "urbit/config"
2
+ require "urbit/ship"
3
+ require "urbit/version"
3
4
 
4
5
  # This is the main namespace for Urbit.
5
6
  #
data/urbit-api.gemspec CHANGED
@@ -1,10 +1,10 @@
1
- require_relative 'lib/urbit/api/version'
1
+ require_relative 'lib/urbit/version'
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "urbit-api"
5
- spec.version = Urbit::Api::VERSION
5
+ spec.version = Urbit::VERSION
6
6
  spec.authors = ["Daryl Richter"]
7
- spec.email = ["daryl@deliverycircle.com"]
7
+ spec.email = ["daryl@ngzax.com"]
8
8
 
9
9
  spec.summary = %q{The Ruby interface to the Urbit HTTP API}
10
10
  spec.description = %q{Access your urbit ship the ruby way. It's a Martian gem.}
@@ -18,17 +18,16 @@ Gem::Specification.new do |spec|
18
18
  spec.metadata["changelog_uri"] = "https://github.com/Zaxonomy/urbit-ruby/CHANGELOG.md"
19
19
 
20
20
  # Specify which files should be added to the gem when it is released.
21
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
23
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
- end
21
+ spec.files = Dir.glob("lib{.rb,/**/*}", File::FNM_DOTMATCH).reject {|f| File.directory?(f) }
22
+ spec.files += %w[urbit-api.gemspec] # include the gemspec itself because warbler breaks w/o it
25
23
 
26
24
  spec.bindir = "exe"
27
25
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
26
  spec.require_paths = ["lib"]
29
27
 
30
- spec.add_dependency "faraday", "~> 1.3.0"
31
- spec.add_dependency "ld-eventsource", "~> 2.0.0"
28
+ spec.add_dependency "faraday", "~> 2.2.0"
29
+ spec.add_dependency "ld-eventsource", "~> 2.2.0"
30
+ spec.add_dependency "uri", "0.10.0" # Pinning this for now b/c 0.11 is broken. :(
32
31
 
33
32
  spec.add_development_dependency "pry", "~> 0.13"
34
33
  spec.add_development_dependency "rspec", "~> 3.10"
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.2.0
4
+ version: 0.4.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: 2021-09-08 00:00:00.000000000 Z
11
+ date: 2022-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -16,28 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.3.0
19
+ version: 2.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.3.0
26
+ version: 2.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: ld-eventsource
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 2.0.0
33
+ version: 2.2.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 2.0.0
40
+ version: 2.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: uri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.10.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.10.0
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: pry
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -68,48 +82,37 @@ dependencies:
68
82
  version: '3.10'
69
83
  description: Access your urbit ship the ruby way. It's a Martian gem.
70
84
  email:
71
- - daryl@deliverycircle.com
85
+ - daryl@ngzax.com
72
86
  executables: []
73
87
  extensions: []
74
88
  extra_rdoc_files: []
75
89
  files:
76
- - ".gitignore"
77
- - ".rspec"
78
- - ".ruby-version"
79
- - CHANGELOG.md
80
- - Gemfile
81
- - LICENSE.txt
82
- - README.gem.md
83
- - README.md
84
- - Rakefile
85
- - _config.yml
86
- - bin/console
87
- - bin/setup
88
- - bin/test
90
+ - lib/urbit.rb
89
91
  - lib/urbit/ack_message.rb
90
92
  - lib/urbit/api.rb
91
- - lib/urbit/api/version.rb
93
+ - lib/urbit/bucket.rb
92
94
  - lib/urbit/channel.rb
93
95
  - lib/urbit/chat_channel.rb
94
96
  - lib/urbit/close_message.rb
95
97
  - lib/urbit/config.rb
96
98
  - lib/urbit/fact.rb
99
+ - lib/urbit/fact/base_fact.rb
100
+ - lib/urbit/fact/graph_fact.rb
101
+ - lib/urbit/fact/group_fact.rb
102
+ - lib/urbit/fact/settings_fact.rb
97
103
  - lib/urbit/graph.rb
104
+ - lib/urbit/group.rb
105
+ - lib/urbit/group_manager.rb
106
+ - lib/urbit/group_parser.rb
98
107
  - lib/urbit/message.rb
99
108
  - lib/urbit/node.rb
100
109
  - lib/urbit/parser.rb
101
110
  - lib/urbit/poke_message.rb
102
111
  - lib/urbit/receiver.rb
112
+ - lib/urbit/settings.rb
103
113
  - lib/urbit/ship.rb
104
114
  - lib/urbit/subscribe_message.rb
105
- - lib/urbit/urbit.rb
106
- - misc/graph-store_graph
107
- - misc/graph-store_keys
108
- - misc/graph-store_node
109
- - misc/graph-store_update
110
- - misc/graph-update_add-graph
111
- - misc/graph-update_add-nodes
112
- - misc/post
115
+ - lib/urbit/version.rb
113
116
  - urbit-api.gemspec
114
117
  homepage: https://www.ngzax.com
115
118
  licenses:
@@ -133,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
136
  - !ruby/object:Gem::Version
134
137
  version: '0'
135
138
  requirements: []
136
- rubygems_version: 3.1.4
139
+ rubygems_version: 3.1.6
137
140
  signing_key:
138
141
  specification_version: 4
139
142
  summary: The Ruby interface to the Urbit HTTP API
data/.gitignore DELETED
@@ -1,25 +0,0 @@
1
- _config-*.yml
2
- *.gem
3
- *.rbc
4
- /coverage/
5
- /pkg/
6
- /test/tmp/
7
- /test/version_tmp/
8
- /tmp/
9
-
10
- ## Documentation cache and generated files:
11
- /.yardoc/
12
- /_yardoc/
13
- /doc/
14
- /rdoc/
15
-
16
- ## Environment normalization:
17
- /.bundle/
18
- /vendor/bundle
19
- /lib/bundler/man/
20
-
21
- # for a library or gem, you might want to ignore these files since the code is
22
- # intended to run in multiple environments; otherwise, check them in:
23
- Gemfile.lock
24
- .ruby-version
25
- # .ruby-gemset
data/.rspec DELETED
@@ -1 +0,0 @@
1
- --require spec_helper
data/.ruby-version DELETED
@@ -1 +0,0 @@
1
- 2.7.2
data/CHANGELOG.md DELETED
@@ -1 +0,0 @@
1
- Nothing to see here.
data/Gemfile DELETED
@@ -1,6 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- # Specify your gem's dependencies in urbit-api.gemspec
4
- gemspec
5
-
6
- gem "rake", "~> 12.0"
data/LICENSE.txt DELETED
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2021 Daryl Richter
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
data/README.gem.md DELETED
@@ -1,4 +0,0 @@
1
-
2
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/urbit/ruby`. To experiment with that code, run `bin/console` for an interactive prompt.
3
-
4
- TODO: Delete this and the text above, and describe your gem
data/README.md DELETED
@@ -1,237 +0,0 @@
1
- # Urbit::Api
2
- ## The Ruby interface to the Urbit HTTP API
3
-
4
- This library wraps the Urbit ship http interface exposing it as a Ruby gem.
5
-
6
- [![awesome urbit badge](https://img.shields.io/badge/~-awesome%20urbit-lightgrey)](https://github.com/urbit/awesome-urbit)
7
-
8
- ## Installation
9
-
10
- Add this line to your application's Gemfile:
11
-
12
- ```ruby
13
- gem 'urbit-api'
14
- ```
15
-
16
- And then execute:
17
-
18
- $ bundle install
19
-
20
- Or install it yourself as:
21
-
22
- $ gem install urbit-api
23
-
24
- ## Usage
25
-
26
- ```sh
27
- > bin/console
28
-
29
- # This will instantiate a ship that connects to the fake `~zod` dev server by default
30
- # See Urbit docs for more info: https://urbit.org/using/develop/
31
- [1] pry(main)> ship = Urbit.new
32
- => #<Urbit::Ship:0x00007fa74b87f920 ...
33
-
34
- OR... with config file...
35
- > ship = Urbit.connect(config_file: '_config-barsyr-latreb.yml')
36
-
37
- > ship.logged_in?
38
- => false
39
-
40
- > ship.login
41
- => #<Urbit::Ship:0x00007fa74b87f920 ...
42
-
43
- > ship.logged_in?
44
- => true
45
-
46
- > ship.to_s
47
- => "a Ship(name: '~barsyr-latreb', host: 'http://localhost', port: '8080')"
48
-
49
- > channel = ship.subscribe(app: 'graph-store', path: '/updates')
50
- => a Channel (Open) on ~barsyr-latreb(name: 'Channel-0', key: '1622836437b540b4')
51
-
52
- # Subscribing works by opening a Channel. Your ships has a collection of all it's open Channels.
53
- > channel = ship.open_channels.first
54
- => a Channel (Open) on ~barsyr-latreb(name: 'Channel-0', key: '1622836437b540b4')
55
-
56
- # Notice that it's the same one.
57
-
58
- # Every Channel has a unique key to identify it.
59
- > channel.key
60
- => "16142890875c348d"
61
-
62
- # The Channel has a Receiver that will now be listening on the app and path you specified. Each time an event is sent in it will be stored in the receiver's facts collection.
63
- > channel.receiver.facts.count
64
- => 12
65
-
66
- # Perform any action through landscape that would initiate an update into %graph-store...
67
- # In this case I have added a comment to a local notebook.
68
- > channel.receiver.facts.last
69
- => a Fact({:ship=>{:name=>"~barsyr-latreb", :host=>"http://localhost", :port=>"8080"}, :resource=>"~barsyr-latreb/test0-996", :acknowleged=>true, :is_graph_update=>true})
70
-
71
- # Your ship keeps a collection of all the messages sent to urbit:
72
- > channel.sent_messages.collect {|m| m.to_s}
73
- => [
74
- "a Message({:action=>"poke", :app=>"hood", :id=>1, :json=>"Opening Airlock", :mark=>"helm-hi", :ship=>"barsyr-latreb"})",
75
- "a Message({:action=>"subscribe", :app=>"graph-store", :id=>2, :path=>"/updates", :ship=>"barsyr-latreb"})",
76
- "a Message({"id"=>3, "action"=>"ack", "event-id"=>"0"})",
77
- "a Message({"id"=>4, "action"=>"ack", "event-id"=>"1"})",
78
- "a Message({"id"=>5, "action"=>"ack", "event-id"=>"2"})"
79
- ]
80
-
81
- #
82
- # --------------------------------------------------------------------
83
- # Poke
84
- # --------------------------------------------------------------------
85
- #
86
- > ship.poke(app: 'hood', mark: 'helm-hi', message: 'Opening Airlock')
87
- => a Channel (Open) on ~barsyr-latreb(name: 'Channel-0', key: '1630355920a717e1')
88
-
89
- #
90
- # --------------------------------------------------------------------
91
- # Scry
92
- # --------------------------------------------------------------------
93
- #
94
- # Retrieving your ship's base hash using scry....
95
- > ship.scry(app: 'file-server', path: '/clay/base/hash')
96
- # => {:status=>200, :code=>"ok", :body=>"\"e75k5\""}
97
-
98
- #
99
- # --------------------------------------------------------------------
100
- # Spider
101
- # --------------------------------------------------------------------
102
- #
103
- # Creating a new Notebook in "My Channels" using %spider....
104
- > create_json = %Q(
105
- {"create": {"resource": { "ship": "~zod", "name": "random_name"},
106
- "title": "Testing",
107
- "description": "Testing Un-Managed Graph Creation",
108
- "associated" : {"policy": {"invite": {"pending": []}}},
109
- "module": "publish", "mark": "graph-validator-publish"}}
110
- )
111
- > ship.spider(mark_in: 'graph-view-action', mark_out: 'json', thread: 'graph-create', data: create_json)
112
- # => {:status=>200, :code=>"ok", :body=>"\"e75k5\""}
113
-
114
- #
115
- # --------------------------------------------------------------------
116
- # %graph-store
117
- # --------------------------------------------------------------------
118
- #
119
- > puts ship.graph_names
120
- ~barsyr-latreb/dm-inbox
121
- ~darlur/announce
122
- ~bitbet-bolbel/urbit-community-5.963
123
- ~winter-paches/top-shelf-6391
124
- ~winter-paches/the-great-north-7.579
125
- ~barsyr-latreb/test0-996
126
- ~fabled-faster/test-chat-a-5919
127
- ~barsyr-latreb/test1-4287
128
- ~darrux-landes/welcome-to-urbit-community
129
- ~millyt-dorsen/finance-2.962
130
- ~fabled-faster/interface-testing-facility-683
131
- ~darlur/help-desk-4556
132
- =>
133
-
134
- # Reference a graph by name and return a single node.
135
- > puts ship.graph(resource: '~winter-paches/top-shelf-6391').node(index: "170.141.184.505.207.751.870.046.689.877.378.990.080")
136
- a Node({:index=>"170.141.184.505.207.751.870.046.689.877.378.990.080", :author=>"witfyl-ravped", :contents=>[{"text"=>"the patches don't really bother me though tbh"}], :time_sent=>1629316468195, :is_parent=>false, :child_count=>0})
137
- =>
138
-
139
- # You can also reference a graph by its index in the graphs collection.
140
- > puts ship.graphs[3].node(index: "170.141.184.505.207.751.870.046.689.877.378.990.080")
141
- a Node({:index=>"170.141.184.505.207.751.870.046.689.877.378.990.080", :author=>"witfyl-ravped", :contents=>[{"text"=>"the patches don't really bother me though tbh"}], :time_sent=>1629316468195, :is_parent=>false, :child_count=>0})
142
- =>
143
-
144
- # Return the contents of the 5 oldest nodes of a graph
145
- > graph = ship.graph(resource: '~winter-paches/top-shelf-6391')
146
- > graph.oldest_nodes(count: 5).sort.each {|n| p n.contents};nil
147
- [{"text"=>"watching the 2020 stanley cup finals (tampa (sigh) just went up 2-0 in game 3) and i thought: \"the great north has to have a hockey chat, eh?\""}]
148
- [{"text"=>"we'll see if this has legs. ;)"}]
149
- [{"text"=>"shortie! now 2-1 tampa."}]
150
- [{"text"=>"looks like tampa's going to go up 2-1. as a canadian this geographically depresses me. :/"}]
151
- [{"text"=>"anyone in the stands?"}]
152
- =>
153
-
154
- # A single Node. In this case, the 3rd oldest node in the graph.
155
- > puts graph.nodes[2].contents
156
- {"text"=>"shortie! now 2-1 tampa."}
157
- =>
158
-
159
- # Getting the next newer Node. Remember that it always returns an Array, hence the '#first'.
160
- > puts graph.nodes[2].next.first.contents
161
- {"text"=>"looks like tampa's going to go up 2-1. as a canadian this geographically depresses me. :/"}
162
- =>
163
-
164
- # Return the indexes of the newest 5 nodes of a graph
165
- > ship.graph(resource: '~winter-paches/top-shelf-6391').newest_nodes(count: 5).sort.each {|n| p n.index};nil
166
- "170.141.184.505.209.257.330.601.508.862.548.770.816"
167
- "170.141.184.505.209.375.247.350.471.711.992.578.048"
168
- "170.141.184.505.209.545.972.004.310.065.795.301.376"
169
- "170.141.184.505.209.627.337.970.761.265.544.429.568"
170
- "170.141.184.505.209.644.102.846.398.558.514.446.336"
171
- =>
172
-
173
- # Fetching nodes older relative to another node. (See indexes above)
174
- > puts (node = ship.graph(resource: '~winter-paches/top-shelf-6391').node(index: "170.141.184.505.209.644.102.846.398.558.514.446.336"))
175
- a Node({:index=>"170.141.184.505.209.644.102.846.398.558.514.446.336", :author=>"winter-paches", :contents=>[{"text"=>"yep. that's how i did it as a kid. harry caray was the white sox announcer before he turned traitor and went to the cubs."}], :time_sent=>1629419046028, :is_parent=>false, :child_count=>0})
176
- =>
177
-
178
- > puts node.previous
179
- a Node({:index=>"170.141.184.505.209.627.337.970.761.265.544.429.568", :author=>"pathus-hiddyn", :contents=>[{"text"=>"Lol oh man I haven’t listened to a baseball game on the radio in forever. It is great isn’t it. "}], :time_sent=>1629418137668, :is_parent=>false, :child_count=>0})
180
- =>
181
-
182
- > node.previous(count: 4).each {|n| p n.index};nil
183
- "170.141.184.505.209.257.330.601.508.862.548.770.816"
184
- "170.141.184.505.209.375.247.350.471.711.992.578.048"
185
- "170.141.184.505.209.545.972.004.310.065.795.301.376"
186
- "170.141.184.505.209.627.337.970.761.265.544.429.568"
187
- ```
188
- ### Configuration
189
-
190
- Configure your ship using a config file or constructor keyword arguments. Either or both can be used; the keyword args will override any values set via config file.
191
-
192
- Supported keys:
193
- - `code` - the auth code
194
- - `host` - the ship's host (e.g., 'localhost' or 'myship.net')
195
- - `name` - the ship's name (e.g, '~zod')
196
- - `port` - the open www port on your ship ('80' by default)
197
-
198
- #### Config File
199
-
200
- See [`_config.yml`](_config.yml) for an example config file. This will connect to a local fake zod, see creation instructions below.
201
-
202
- ```rb
203
- ship = Urbit.new(config_file: 'my-moon.yml')
204
- ```
205
-
206
- #### Constructor Keyword Arguments
207
-
208
- ```rb
209
- ship = Urbit.new(host: '127.0.0.1', port: '8080')
210
- ```
211
-
212
- ## Testing
213
-
214
- ```sh
215
- bin/test
216
- ```
217
- Tests assume that an instance of a ["fake" development Urbit ship](https://urbit.org/using/develop/) (one not connected to the live network) will be running, available at `http://localhost:8080`.
218
- ### "fake" ~zod
219
-
220
- To create this development ship:
221
- ```sh
222
- ./urbit -F zod
223
- ```
224
- ## Development
225
-
226
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
227
-
228
- To install this gem onto your local machine, run `bundle exec rake install`.
229
-
230
- ## Contributing
231
-
232
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/urbit-api.
233
-
234
-
235
- ## License
236
-
237
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile DELETED
@@ -1,10 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
3
-
4
- Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
7
- t.test_files = FileList["test/**/*_test.rb"]
8
- end
9
-
10
- task :default => :test
data/_config.yml DELETED
@@ -1,2 +0,0 @@
1
- code: 'lidlut-tabwed-pillex-ridrup'
2
- ship: '~zod'