urbit-api 0.2.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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'