We have BUNDLE CREATION 🎉 🎉 🎉

This commit is contained in:
Netscape Navigator 2020-03-15 11:51:13 -05:00
parent 34e81f859a
commit 31daf90cdc
7 changed files with 66 additions and 4 deletions

3
.gitignore vendored
View File

@ -2,4 +2,5 @@ coverage/
.pigeon/
*.pigeon
doc/
*scratchpad*
*scratchpad*
pigeon.bundle

View File

@ -30,7 +30,8 @@ Eg: `pigeon identity show` becomes `./pigeon-cli show`.
- [X] pigeon draft append
- [X] pigeon draft current
- [X] pigeon draft save
- [ ] pigeon bundle create
- [X] pigeon bundle create
- [ ] Use JSON.stringify() for string keys (instead of `inspect`)
- [ ] pigeon bundle consume
- [ ] pigeon message find
- [ ] pigeon message find-all

4
dist/pigeon.rb vendored
View File

@ -13,6 +13,8 @@ module Pigeon
TPL_DIR = "views"
PIGEON_DB_PATH = File.join("db.pigeon")
DEFAULT_BUNDLE_PATH = "./pigeon.bundle"
# MESSAGE TEMPLATE CONSTANTS:
HEADER_TPL = File.read(File.join(TPL_DIR, "1_header.erb")).sub("\n", "")
BODY_TPL = File.read(File.join(TPL_DIR, "2_body.erb")).sub("\n", "")
@ -22,6 +24,7 @@ module Pigeon
EMPTY_MESSAGE = "NONE"
OUTBOX_PATH = File.join(".pigeon", "user")
DRAFT_PLACEHOLDER = "DRAFT"
BUNDLE_MESSAGE_SEPARATOR = "\n\n"
# /MESSAGE TEMPLATE CONSTANTS
# Internal namespaces for PStore keys:
@ -53,3 +56,4 @@ require_relative File.join("pigeon", "draft_serializer.rb")
require_relative File.join("pigeon", "message_serializer.rb")
require_relative File.join("pigeon", "message.rb")
require_relative File.join("pigeon", "draft.rb")
require_relative File.join("pigeon", "bundle.rb")

25
dist/pigeon/bundle.rb vendored Normal file
View File

@ -0,0 +1,25 @@
module Pigeon
class Bundle
def self.create(file_path = DEFAULT_BUNDLE_PATH)
s = Pigeon::Storage.current
last = s.message_count
author = Pigeon::KeyPair.current
range = (0...last).to_a
content = range
.map { |depth| s.get_message_by_depth(author, depth) }
.map { |multihash| s.find_message(multihash) }
.map { |message| message.render }
.join(BUNDLE_MESSAGE_SEPARATOR)
File.write(file_path, content)
end
def self.ingest(file_path)
raise "WIP"
end
private
def initialize
end
end
end

View File

@ -3,7 +3,7 @@ require "pstore"
module Pigeon
class Storage
def self.reset
File.delete(PIGEON_DB_PATH) if @current
File.delete(PIGEON_DB_PATH) if File.file?(PIGEON_DB_PATH)
@current = nil
end
@ -31,6 +31,12 @@ module Pigeon
end
end
def find_message(multihash)
store.transaction(true) do
store[MESG_NS].fetch(multihash)
end
end
def set_config(key, value)
store.transaction do
store[CONF_NS][key] = value

View File

@ -0,0 +1,26 @@
require "spec_helper"
RSpec.describe Pigeon::Message do
before(:each) do
Pigeon::Storage.reset
Pigeon::KeyPair.reset
end
def create_message(params)
draft = Pigeon::Draft.create(kind: SecureRandom.uuid)
params.map { |(k, v)| draft[k] = v }
Pigeon::Message.publish(draft)
end
it "creates a bundle" do
expected_bundle = (1..10)
.to_a
.map do |n| { foo: ["bar", 123, SecureRandom.uuid].sample } end
.map do |d| create_message(d) end
.map(&:render)
.join("\n\n")
Pigeon::Bundle.create
actual_bundle = File.read(Pigeon::DEFAULT_BUNDLE_PATH)
expect(expected_bundle).to eq(actual_bundle)
end
end

View File

@ -113,7 +113,6 @@ RSpec.describe Pigeon::Message do
sig1_b64 = Base64.urlsafe_encode64(sig1) + Pigeon::SIG_FOOTER
sig2_b64 = Base64.urlsafe_encode64(sig2) + Pigeon::SIG_FOOTER
expect(message.signature).to eq(sig1_b64)
expect(message.signature).to eq(sig2_b64)
end