Give up on `lipmaa` (for now)

This commit is contained in:
Netscape Navigator 2020-11-08 14:55:07 -06:00
parent cba6749e2f
commit 8464c81ecc
21 changed files with 82 additions and 165 deletions

View File

@ -49,7 +49,6 @@ See `kitchen_sink.sh` examples.
- [ ] Stop using old nested blob bundles. Start using "flat" blobs.
- [ ] Ability to unblock someone.
- [ ] Ability to delete a key from a draft.
- [ ] Update Dev docs in protocol spec to reflect changes to `lipmaa` header.
- [ ] 100% class / module documentation
- [ ] Run a [terminology extraction tool](https://www.visualthesaurus.com/vocabgrabber/#) on the documentation and write a glossary of terms.
- [ ] Ability to list all blocked users.
@ -57,7 +56,6 @@ See `kitchen_sink.sh` examples.
# "Nice to Have"
- [ ] Support partial verification via `lipmaa` property.
- [ ] Add `--since=`/`--until=` args to `bundle create` for sending partial / "slice" bundles.
- [ ] Interest and Disinterest Signalling for document routing: Create a `$blob_status` message to express `have`, `want` signalling. This can steer bundle creation and an eventual `--for` flag at bundle creation time to customize a bundle to a particular user.
- [ ] Add a schema for `$peer_status`. Eg: `block`, `unblock`, `follow`, `unfollow`.

View File

@ -17,7 +17,6 @@ module Pigeon
"author <%= author %>",
"depth <%= depth %>",
"kind <%= kind %>",
"lipmaa <%= lipmaa %>",
"prev <%= prev %>",
"\n",
].join("\n")
@ -91,40 +90,6 @@ module Pigeon
"X" => 0b11101, "Y" => 0b11110, "Z" => 0b11111,
}.freeze
def self.lipmaa(n)
# The original lipmaa function returns -1 for 0
# but that does not mesh well with our serialization
# scheme. Comments welcome on this one.
if n < 1 # Prevent -1, division by zero etc..
return nil
end
m, po3, x = 1, 3, n
# find k such that (3^k - 1)/2 >= n
while (m < n)
po3 *= 3
m = (po3 - 1) / 2
end
po3 /= 3
# find longest possible backjump
if (m != n)
while x != 0
m = (po3 - 1) / 2
po3 /= 3
x %= m
end
if (m != po3)
po3 = m
end
end
result = n - po3
if result == n - 1
return nil
else
return result
end
end
# http://www.crockford.com/wrmg/base32.html
def self.b32_encode(string)
string
@ -176,12 +141,6 @@ module Pigeon
draft.author = author
draft.depth = depth
draft.prev = db.get_message_by_depth(mhash, depth - 1)
lpma = Helpers.lipmaa(depth)
if lpma && draft.prev
draft.lipmaa = db.get_message_by_depth(mhash, lpma)
else
draft.lipmaa = NOTHING
end
unsigned = template.render_without_signature
draft.signature = author.sign(unsigned)
@ -214,13 +173,6 @@ module Pigeon
count = db.get_message_count_for(author.multihash)
expected_prev = db.get_message_by_depth(author.multihash, count - 1) || Pigeon::NOTHING
assert("depth", count, msg.depth)
expected_lpma = Helpers.lipmaa(msg.depth)
if expected_lpma
real = db.get_message_by_depth(author.multihash, expected_lpma)
assert("lipmaa", msg.lipmaa, real)
else
assert("lipmaa", msg.lipmaa, NOTHING)
end
assert("prev", msg.prev, expected_prev)
tpl = msg.template.render_without_signature
Helpers.verify_string(author, signature, tpl)

View File

@ -67,14 +67,12 @@ module Pigeon
body:,
depth:,
kind:,
lipmaa:,
prev:,
signature:)
msg = Message.new(author: RemoteIdentity.new(author),
kind: kind,
body: body,
prev: prev,
lipmaa: lipmaa,
signature: signature,
depth: depth)
_save_message(msg)

View File

@ -2,7 +2,7 @@ require "digest"
module Pigeon
class Draft
attr_accessor :signature, :prev, :lipmaa, :kind, :depth,
attr_accessor :signature, :prev, :kind, :depth,
:body, :author
def initialize(kind:, body: {})
@ -12,7 +12,6 @@ module Pigeon
@depth = -1
@body = {}
@author = Pigeon::NOTHING
@lipmaa = Pigeon::NOTHING
body.to_a.map { |(k, v)| self[k] = v }
end

View File

@ -11,7 +11,6 @@ module Pigeon
depth = DRAFT_PLACEHOLDER
prev = DRAFT_PLACEHOLDER
signature = DRAFT_PLACEHOLDER
lipmaa = DRAFT_PLACEHOLDER
ERB.new([HEADER_TPL, BODY_TPL].join("")).result(binding)
end
end

View File

@ -76,7 +76,6 @@ module Pigeon
SEPERATOR = /\n/
AUTHOR = /author #{FEED_VALUE}\n/
DEPTH = /depth #{NUMERIC}\n/
LIPMAA = /lipmaa (#{MESG_VALUE}|#{NULL_VALUE})\n/
PREV = /prev (#{MESG_VALUE}|#{NULL_VALUE})\n/
KIND = /kind #{ALPHANUMERICISH}\n/
BODY_ENTRY = /#{ALPHANUMERICISH}:#{ANY_VALUE}\n/
@ -106,8 +105,7 @@ module Pigeon
AUTHOR: [:FOOTER_SEPERATOR, :START],
DEPTH: [:AUTHOR],
KIND: [:DEPTH],
LIPMAA: [:KIND],
PREV: [:LIPMAA],
PREV: [:KIND],
HEADER_SEPERATOR: [:PREV],
}
@ -136,13 +134,6 @@ module Pigeon
return
end
if scanner.scan(LIPMAA)
depth = scanner.matched.chomp.gsub("lipmaa ", "")
@tokens << [:LIPMAA, depth, scanner.pos]
check_header_order(:LIPMAA)
return
end
if scanner.scan(PREV)
prev = scanner.matched.chomp.gsub("prev ", "")
@tokens << [:PREV, prev, scanner.pos]

View File

@ -2,7 +2,7 @@ require "digest"
module Pigeon
class Message
attr_reader :author, :kind, :body, :signature, :depth, :lipmaa, :prev
attr_reader :author, :kind, :body, :signature, :depth, :prev
def render
template.render.chomp
@ -20,7 +20,6 @@ module Pigeon
body:,
depth:,
prev:,
lipmaa:,
signature:)
raise MISSING_BODY if body.empty?
@ -29,7 +28,6 @@ module Pigeon
@depth = depth
@kind = kind
@prev = prev || Pigeon::NOTHING
@lipmaa = lipmaa
@signature = signature
end

View File

@ -26,7 +26,6 @@ module Pigeon
depth = message.depth
kind = message.kind
prev = message.prev || NOTHING
lipmaa = message.lipmaa || NOTHING
signature = message.signature
ERB.new(template).result(binding)

View File

@ -22,7 +22,6 @@ module Pigeon
when :KIND then set(:kind, token[1])
when :DEPTH then set(:depth, token[1])
when :PREV then set(:prev, token[1])
when :LIPMAA then set(:lipmaa, token[1])
when :HEADER_END then set(:body, {})
when :BODY_ENTRY then set(token[1], token[2], @scratchpad[:body])
when :BODY_END then nil

View File

@ -88,7 +88,7 @@ We do not have a draft yet. We need to create one:
db.new_draft(kind: "garden_diary", body: {"message_text"=>"Tomato plant looking healthy."})
=> #<Pigeon::Draft:0x00005603ed399b48 @author="NONE",
# @body={"greeting"=>"\"Hello, world!\""}, @depth=-1, @kind="example123",
# @lipmaa="NONE", @prev="NONE", @signature="NONE">
# @prev="NONE", @signature="NONE">
```
The command above creates a new draft entry of kind `garden_entry` with one key/value pair in the body. We can view the draft at any time via `#get_draft`:
@ -97,7 +97,7 @@ The command above creates a new draft entry of kind `garden_entry` with one key/
db.get_draft
# => #<Pigeon::Draft:0x00005603ed81e830 @author="NONE",
# @body={"greeting"=>"\"Hello, world!\""}, @depth=-1,
# @kind="example123", @lipmaa="NONE", @prev="NONE",
# @kind="example123", @prev="NONE",
# @signature="NONE">
```
@ -123,7 +123,6 @@ puts human_readable_string
# => author DRAFT
# depth DRAFT
# kind garden_diary
# lipmaa DRAFT
# prev DRAFT
#
# greeting:"Hello, world!"
@ -133,7 +132,7 @@ puts human_readable_string
Some interesting things about the draft we just rendered:
* Unlike a message, a draft has no signature (yet).
* The `author`, `kind`, `prev`, `depth`, `lipmaa` properties are all set to `"DRAFT"`. Real values will be populated when we finally publish the draft.
* The `author`, `kind`, `prev`, `depth` properties are all set to `"DRAFT"`. Real values will be populated when we finally publish the draft.
If we want to start over, we can delete a draft via `delete_current_draft`:
@ -156,7 +155,6 @@ my_message = db.publish_draft
@body={"greeting"=>"\"Hello, world!\"", "current_mood"=>"\"Feeling great\""},
@depth=0,
@kind="garden_diary",
@lipmaa="NONE",
@prev="NONE",
@signature="QNY...208">
```
@ -168,7 +166,6 @@ puts my_message.render
# author USER.6DQ4RRNBKJ2T4EY5E1GZYYX6X6SZXV1W0GNH1HA4KGKA5KZ2Y2DG
# depth 0
# kind garden_diary
# lipmaa NONE
# prev NONE
#
# greeting:"Hello, world!"
@ -195,7 +192,6 @@ message = db.add_message("garden_entry", {"message_text" => "The basil is just O
# @body={"message_text"=>"\"The basil is just OK\"", "current_mood"=>"\"content\""},
# @depth=1,
# @kind="garden_entry",
# @lipmaa="NONE",
# @prev="TEXT.NPNQZAP9CB79GP8J0SN52F38EBJ9WV370HX6MVZD3XB804TVQQB0",
# @signature="95E...J3G">
@ -203,7 +199,6 @@ puts message.render
# author USER.6DQ4RRNBKJ2T4EY5E1GZYYX6X6SZXV1W0GNH1HA4KGKA5KZ2Y2DG
# depth 1
# kind garden_entry
# lipmaa NONE
# prev TEXT.NPNQZAP9CB79GP8J0SN52F38EBJ9WV370HX6MVZD3XB804TVQQB0
#
# message_text:"The basil is just OK"
@ -231,7 +226,6 @@ old_message = db.read_message("TEXT.444CC4NFHGQDQEZ6B6HSEPNZAZ80RSQF8TCAX8QR9NBR
# @body={"message_text"=>"\"The basil is just OK\"", "current_mood"=>"\"content\""},
# @depth=1,
# @kind="garden_entry",
# @lipmaa="NONE",
# @prev="TEXT.NPNQZAP9CB79GP8J0SN52F38EBJ9WV370HX6MVZD3XB804TVQQB0",
# @signature="95E...J3G">
@ -239,7 +233,6 @@ puts old_message.render
# author USER.6DQ4RRNBKJ2T4EY5E1GZYYX6X6SZXV1W0GNH1HA4KGKA5KZ2Y2DG
# depth 1
# kind garden_entry
# lipmaa NONE
# prev TEXT.NPNQZAP9CB79GP8J0SN52F38EBJ9WV370HX6MVZD3XB804TVQQB0
# message_text:"The basil is just OK"
@ -367,7 +360,6 @@ puts msg.render
# author USER.6DQ4RRNBKJ2T4EY5E1GZYYX6X6SZXV1W0GNH1HA4KGKA5KZ2Y2DG
# depth 2
# kind photo
# lipmaa NONE
# prev TEXT.444CC4NFHGQDQEZ6B6HSEPNZAZ80RSQF8TCAX8QR9NBR5T0XX92G
#
# my_cat_picture:FILE.FV0FJ0YZADY7C5JTTFYPKDBHTZJ5JVVP5TCKP0605WWXYJG4VMRG

View File

@ -1,29 +1,26 @@
author USER.09XBQDDGZPEKFBFBY67XNR5QA0TRWAKYKYNEDNQTZJV0F1JB0DGG
author USER.59X51RSZQZR15BX86VDWG37AAMVP43PTBWD1WS66FQFCDPHAQDZ0
depth 0
kind example
lipmaa NONE
prev NONE
file_name:FILE.FV0FJ0YZADY7C5JTTFYPKDBHTZJ5JVVP5TCKP0605WWXYJG4VMRG
signature ZYSCKNFP8TW9DME9P9DK4Z4RV09APVEE762HK628K18NMS4DX084XKED71TCRXJNZBWY3TWDYVK1W3K496QF7Y55SCKEWP1D0SP5R30
signature N33N7D8KFFVVPHTDE17JS7708YPAVF2F0F0AZS1FFW3D15ZH1K3HEFNQJK7KT7NMSAF8PDC1YDD5M57NPG2PTEEYPBKC1G3HFHN3J08
author USER.09XBQDDGZPEKFBFBY67XNR5QA0TRWAKYKYNEDNQTZJV0F1JB0DGG
author USER.59X51RSZQZR15BX86VDWG37AAMVP43PTBWD1WS66FQFCDPHAQDZ0
depth 1
kind example
lipmaa NONE
prev TEXT.RGKRHC0APNN9FCJTVBN1NR1ZYQ9ZY34PYYASSMJ6016S30ZTWHR0
prev TEXT.S5G187G11N2T76E2TSPS40K5QEY6S9ZC68TKEVH7JBPN27VDTKY0
file_name:FILE.YPF11E5N9JFVB6KB1N1WDVVT9DXMCHE0XJWBZHT2CQ29S5SEPCSG
signature GAZGWG8PWZSP4VSSNYD8J873CQ6KDM93SBMA9VGGC1YW66FER96HEGZQ4CJBH51YN22WMGYADNY2SCWS0JY6YPX4APFDQ60X751JJ1R
signature 53454CZKNSBK4D8NZCKWRWWE37DVANJWCS891XGRR2M8M4AJP2XNTC86MQAWAMYX3W517KWW6JD9MX3FMXNNBQ1TJS5HSK9CTW9G018
author USER.09XBQDDGZPEKFBFBY67XNR5QA0TRWAKYKYNEDNQTZJV0F1JB0DGG
author USER.59X51RSZQZR15BX86VDWG37AAMVP43PTBWD1WS66FQFCDPHAQDZ0
depth 2
kind example
lipmaa NONE
prev TEXT.Z3QS1HPX756E22XWKXAXH7NTSTJGY0AHEM9KQNATTC6HHCACZGN0
prev TEXT.5BBGSKGBHKYE6R0SJSZAGNEQA8PGJ5CMTQD1XGKKP2CHYPZR8G90
file_name:FILE.622PRNJ7C0S05XR2AHDPKWMG051B1QW5SXMN2RQHF2AND6J8VGPG
signature W94BVC4ED00Z4TJC0T3BEVC63RJYJC1J4DDS13BJTTGGXK40JSX276B9MV3GPS5JJHZW92YKAZNZ1Q4DCG0K58SCD9ZD0TVZVX7100G
signature JVN1YPVA637NF6GGPCX8GXT5FXTZPA1YM68ZWQQNXYD36CX0PSDBHXQMY7PMJYMCPFYW5BR56P2GVETM8AVYSKAFSYPVM3F7KVDW020

BIN
spec/fixtures/normal/CHHA15QG.blb vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

View File

@ -1,29 +1,35 @@
author USER.Q62ZN46TV1HHYBBD7EFSKWTJQ32PGMYKYXM0GVVM121F8R21RAWG
author USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0
depth 0
kind unit_test1
lipmaa NONE
kind nonsense
prev NONE
example:"Just block me"
signature 0N0B419YSCHYM82YWGBB6VF0MHHCS0ACGBKD8MYMTGS59XC1T60W2JHKHEW9ZQJW53KTJMVB3MGV3JTFKZWQH9QMAAWG3DE6AQ6SJ30
author USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0
depth 1
kind unit_test1
prev TEXT.839FP9NB9E1KFG17SZF49X57B9AYNNX1HQ8DGVE940BPWCRXS82G
foo:"bar"
signature HAM8XEPCAB81P0A5DQKZ3DQG19Q06KR1G4RZ28CX4EXYCZA1A1MPVBQG540EZQSWHS46W523GJK4K3EWM4C0NWSM7NNG99AMJ70VC1G
signature 7YC6P4AJMPV3JH57JV0AHDP0ZV59WZYKHF49DEM2CJP5ZQCVR4XN6RMS18SBE5S2YXAFG05FA8S3B2YC35CH464822ZQXTCMN2F9G3R
author USER.Q62ZN46TV1HHYBBD7EFSKWTJQ32PGMYKYXM0GVVM121F8R21RAWG
depth 1
author USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0
depth 2
kind unit_test2
lipmaa NONE
prev TEXT.DHSWRP0B9241KZ680WJAHVCVR4C79SH5NN3JCE3HFG9DB51WXC2G
prev TEXT.XHHQMFDK1DQSVXQ0XJQDSZQWXF8BNQ1QNRZW4K9V34264MF3WSFG
bar:"baz"
signature S0CSCTVWQ8R827XP4RNW7MQSQ5AT4EPG0AWF259R4ZWR3C83AZYPARXQXZ9Q32GPKEEWTC9RAKC00A0RTHZCETR712D8T7WVV9RBE18
signature 5YBYC1RSB27WZ00H567RP1YAYBW30PAVHG3ZG55VY2R137YMPZZ0ZMD4T7MJ8RYCMTT72AN4WCN7QAS1NPAPQE134TE8CX7PH2TFM2R
author USER.Q62ZN46TV1HHYBBD7EFSKWTJQ32PGMYKYXM0GVVM121F8R21RAWG
depth 2
author USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0
depth 3
kind unit_test3
lipmaa NONE
prev TEXT.8DPH5WX4DWWQ7DF9DBKYMT69Y44XNHHM8W8MV5BNQ7RYRM3W4NSG
prev TEXT.DG0BZ241KY8E60C1F88MTZNEDDBQFZS4EMCNR23VD6Y6RZGNEXSG
cats:"meow"
signature G9NC8H0SJGZ6KKQFM6V9VCGVK5FS0MM6B6G1RHJ09EM1ACVQSJPMHBB8YJYPZWXX2EDRD4MMKYEZ6725RAAXYY42KXZC9PPRVVGKR3G
signature QWHA8KHSVFBC0X84VH2F2BS3CSCY58ER4ETXH1WB8SEEMDBS0TBAQHA2HNK1W7VDATBVZHB7EHWNYEN86HYBKK7BBMNSSMR45CEG838

View File

@ -1,9 +1,8 @@
author USER.FFQE19PEB55S1JMT5CVWZXK6V9D6E54GG8SK31QRXBDGF2AGHW50
author USER.YJTH2BBAAAXK2RYKWRXYE0E0ANME1YPZPD8TV5VCS40X3D75AJ3G
depth 0
kind nonsense
lipmaa NONE
prev NONE
example:"Just block me"
signature ZCP05Q1N8147YT47M5TY84D3K5MW3AB428CQDA5DK57D0J8PH5V7WWZDG2YYET04YCTM9KN2V847Q5SNS6J04HPNP8RW9B9D0EVX610
signature 3WD5EJCMZZ27JJ8EQZ3M5XNK3QZ40A5T894Q27ZVMBT4T65KVZWK5PC74F54DX5EB3D3EFYQJQ5C1D9X2J22QKAJHTSG3B7SC932W28

View File

@ -40,7 +40,8 @@ RSpec.describe Pigeon::Message do
it "does not ingest messages from blocked peers" do
db.reset_database
antagonist = "USER.FFQE19PEB55S1JMT5CVWZXK6V9D6E54GG8SK31QRXBDGF2AGHW50"
expect(db.all_messages.count).to eq(0)
antagonist = "USER.YJTH2BBAAAXK2RYKWRXYE0E0ANME1YPZPD8TV5VCS40X3D75AJ3G"
db.block_peer(antagonist)
db.import_bundle(BLOCKED_PEER_FIXTURE_PATH)
expect(db.all_messages.count).to eq(0)

View File

@ -20,7 +20,6 @@ RSpec.describe Pigeon::Draft do
"author DRAFT",
"depth DRAFT",
"kind unit_test",
"lipmaa DRAFT",
"prev DRAFT",
"\na:\"bar\"",
"b:FILE.CHHABX8Q9D9Q0BY2BBZ6FA7SMAFNE9GGMSDTZVZZC9TK2N9F15QG",

View File

@ -1,22 +1,4 @@
RSpec.describe Pigeon::Helpers do
it "creates lipmalinks" do
[
[-1, nil],
[0, nil],
[1, nil],
[2, nil],
[3, nil],
[4, 1],
[5, nil],
[6, nil],
[7, nil],
[8, 4],
[13, 4],
].each do |(input, expected)|
expect(Pigeon::Helpers.lipmaa(input)).to eq(expected)
end
end
it "handles Crockford Base 32 values" do
10.times do
raw_bytes = SecureRandom.random_bytes(32)

View File

@ -2,43 +2,48 @@ require "spec_helper"
RSpec.describe Pigeon::Lexer do
EXPECTED_TOKENS1 = [
[:AUTHOR, "USER.Q62ZN46TV1HHYBBD7EFSKWTJQ32PGMYKYXM0GVVM121F8R21RAWG", 65],
[:AUTHOR, "USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0", 65],
[:DEPTH, 0, 73],
[:KIND, "unit_test1", 89],
[:LIPMAA, "NONE", 101],
[:PREV, "NONE", 111],
[:HEADER_END, 112],
[:BODY_ENTRY, "foo", "\"bar\"", 122],
[:KIND, "nonsense", 87],
[:PREV, "NONE", 97],
[:HEADER_END, 98],
[:BODY_ENTRY, "example", "\"Just block me\"", 122],
[:BODY_END, 123],
[:SIGNATURE, "HAM8XEPCAB81P0A5DQKZ3DQG19Q06KR1G4RZ28CX4EXYCZA1A1MPVBQG540EZQSWHS46W523GJK4K3EWM4C0NWSM7NNG99AMJ70VC1G", 237],
[:SIGNATURE, "0N0B419YSCHYM82YWGBB6VF0MHHCS0ACGBKD8MYMTGS59XC1T60W2JHKHEW9ZQJW53KTJMVB3MGV3JTFKZWQH9QMAAWG3DE6AQ6SJ30", 237],
[:MESSAGE_DELIM, 238],
[:AUTHOR, "USER.Q62ZN46TV1HHYBBD7EFSKWTJQ32PGMYKYXM0GVVM121F8R21RAWG", 303],
[:AUTHOR, "USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0", 303],
[:DEPTH, 1, 311],
[:KIND, "unit_test2", 327],
[:LIPMAA, "NONE", 339],
[:PREV, "TEXT.DHSWRP0B9241KZ680WJAHVCVR4C79SH5NN3JCE3HFG9DB51WXC2G", 402],
[:HEADER_END, 403],
[:BODY_ENTRY, "bar", "\"baz\"", 413],
[:BODY_END, 414],
[:SIGNATURE, "S0CSCTVWQ8R827XP4RNW7MQSQ5AT4EPG0AWF259R4ZWR3C83AZYPARXQXZ9Q32GPKEEWTC9RAKC00A0RTHZCETR712D8T7WVV9RBE18", 528],
[:MESSAGE_DELIM, 529],
[:AUTHOR, "USER.Q62ZN46TV1HHYBBD7EFSKWTJQ32PGMYKYXM0GVVM121F8R21RAWG", 594],
[:DEPTH, 2, 602],
[:KIND, "unit_test3", 618],
[:LIPMAA, "NONE", 630],
[:PREV, "TEXT.8DPH5WX4DWWQ7DF9DBKYMT69Y44XNHHM8W8MV5BNQ7RYRM3W4NSG", 693],
[:HEADER_END, 694],
[:BODY_ENTRY, "cats", "\"meow\"", 706],
[:BODY_END, 707],
[:SIGNATURE, "G9NC8H0SJGZ6KKQFM6V9VCGVK5FS0MM6B6G1RHJ09EM1ACVQSJPMHBB8YJYPZWXX2EDRD4MMKYEZ6725RAAXYY42KXZC9PPRVVGKR3G", 821],
[:MESSAGE_DELIM, 821],
].freeze
[:KIND, "unit_test1", 327],
[:PREV, "TEXT.839FP9NB9E1KFG17SZF49X57B9AYNNX1HQ8DGVE940BPWCRXS82G", 390],
[:HEADER_END, 391],
[:BODY_ENTRY, "foo", "\"bar\"", 401],
[:BODY_END, 402],
[:SIGNATURE, "7YC6P4AJMPV3JH57JV0AHDP0ZV59WZYKHF49DEM2CJP5ZQCVR4XN6RMS18SBE5S2YXAFG05FA8S3B2YC35CH464822ZQXTCMN2F9G3R", 516],
[:MESSAGE_DELIM, 517],
[:AUTHOR, "USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0", 582],
[:DEPTH, 2, 590],
[:KIND, "unit_test2", 606],
[:PREV, "TEXT.XHHQMFDK1DQSVXQ0XJQDSZQWXF8BNQ1QNRZW4K9V34264MF3WSFG", 669],
[:HEADER_END, 670],
[:BODY_ENTRY, "bar", "\"baz\"", 680],
[:BODY_END, 681],
[:SIGNATURE, "5YBYC1RSB27WZ00H567RP1YAYBW30PAVHG3ZG55VY2R137YMPZZ0ZMD4T7MJ8RYCMTT72AN4WCN7QAS1NPAPQE134TE8CX7PH2TFM2R", 795],
[:MESSAGE_DELIM, 796],
[:AUTHOR, "USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0", 861],
[:DEPTH, 3, 869],
[:KIND, "unit_test3", 885],
[:PREV, "TEXT.DG0BZ241KY8E60C1F88MTZNEDDBQFZS4EMCNR23VD6Y6RZGNEXSG", 948],
[:HEADER_END, 949],
[:BODY_ENTRY, "cats", "\"meow\"", 961],
[:BODY_END, 962],
[:SIGNATURE, "QWHA8KHSVFBC0X84VH2F2BS3CSCY58ER4ETXH1WB8SEEMDBS0TBAQHA2HNK1W7VDATBVZHB7EHWNYEN86HYBKK7BBMNSSMR45CEG838", 1076],
[:MESSAGE_DELIM, 1076],
]
MESSAGE_LINES = [
"author @VG44QCHKA38E7754RQ5DAFBMMD2CCZQRZ8BR2J4MRHHGVTHGW670",
"depth 0",
"kind unit_test",
"lipmaa NONE",
"prev NONE",
"",
"foo:\"bar\"",

View File

@ -48,7 +48,6 @@ RSpec.describe Pigeon::Message do
"author __AUTHOR__",
"depth 0",
"kind unit_test",
"lipmaa NONE",
"prev NONE",
"",
"a:\"bar\"",
@ -135,7 +134,6 @@ RSpec.describe Pigeon::Message do
[:KIND, "invalid"],
[:PREV, "NONE"],
[:DEPTH, 10],
[:LIPMAA, "TEXT.4PE7S4XCCAYPQ42S98K730CEW6ME5HRWJKHHEGYVYPFHSJWXEY1G"],
[:HEADER_END],
[:BODY_ENTRY, "duplicate", "This key is a duplicate."],
[:SIGNATURE, "DN7yPTE-m433ND3jBL4oM23XGxBKafjq0Dp9ArBQa_TIGU7DmCxTumieuPBN-NKxlx_0N7-c5zjLb5XXVHYPCQ=="],

View File

@ -14,7 +14,6 @@ RSpec.describe Pigeon::Lexer do
[:KIND, "invalid"],
[:PREV, "NONE"],
[:DEPTH, 0],
[:LIPMAA, Pigeon::Helpers.lipmaa(0)],
[:HEADER_END],
[:BODY_ENTRY, "duplicate", "Pigeon does not allow duplicate keys."],
[:BODY_ENTRY, "duplicate", "This key is a duplicate."],
@ -24,14 +23,22 @@ RSpec.describe Pigeon::Lexer do
it "parses tokens" do
results = Pigeon::Parser.parse(db, tokens)
expect(results.length).to eq(3)
expect(results.length).to eq(4)
expected_sigs = [
"0N0B419YSCHYM82YWGBB6VF0MHHCS0ACGBKD8MYMTGS59XC1T60W2JHKHEW9ZQJW53KTJMVB3MGV3JTFKZWQH9QMAAWG3DE6AQ6SJ30",
"7YC6P4AJMPV3JH57JV0AHDP0ZV59WZYKHF49DEM2CJP5ZQCVR4XN6RMS18SBE5S2YXAFG05FA8S3B2YC35CH464822ZQXTCMN2F9G3R",
"5YBYC1RSB27WZ00H567RP1YAYBW30PAVHG3ZG55VY2R137YMPZZ0ZMD4T7MJ8RYCMTT72AN4WCN7QAS1NPAPQE134TE8CX7PH2TFM2R",
"QWHA8KHSVFBC0X84VH2F2BS3CSCY58ER4ETXH1WB8SEEMDBS0TBAQHA2HNK1W7VDATBVZHB7EHWNYEN86HYBKK7BBMNSSMR45CEG838",
].sort
actual_sigs = results.map { |x| x.signature }.sort
expect(actual_sigs - expected_sigs).to eq([])
expect(results.first).to be_kind_of(Pigeon::Message)
expect(results.last).to be_kind_of(Pigeon::Message)
end
it "ingests and reconstructs a bundle" do
messages = db.import_bundle("./spec/fixtures/normal")
expect(messages.length).to eq(3)
expect(messages.length).to eq(4)
expect(messages.map(&:class).uniq).to eq([Pigeon::Message])
re_bundled = messages.map(&:render).join("\n\n") + "\n"
expect(re_bundled).to eq(example_bundle)

View File

@ -1,13 +1,12 @@
require "spec_helper"
RSpec.describe Pigeon::MessageSerializer do
SHIM_ATTRS = %i[author body kind depth prev signature lipmaa].freeze
SHIM_ATTRS = %i[author body kind depth prev signature].freeze
MessageShim = Struct.new(*SHIM_ATTRS)
TOP_HALF = [
"author FAKE_AUTHOR",
"\ndepth 23",
"\nkind FAKE_KIND",
"\nlipmaa 22",
"\nprev NONE",
"\n\nfoo:\"bar\"\n\n",
].join("")
@ -28,7 +27,6 @@ RSpec.describe Pigeon::MessageSerializer do
depth: 23,
prev: nil,
signature: "XYZ",
lipmaa: 22,
}.values
message = MessageShim.new(*params)
template = Pigeon::MessageSerializer.new(message)