From e087888e948e375f838e201bc0f3bcaee9b620ce Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Wed, 22 Apr 2020 08:44:12 -0500 Subject: [PATCH] :tada: v0.1.0 - minimally feature complete --- .gitignore | 4 +- README.md | 2 +- TODO.md | 4 +- bin/pigeon-cli | 6 +- db.pigeon | Bin 0 -> 834 bytes gossip.pigeon | 129 ++++++++++++++++++++++++++++++++++++ kitchen_sink.sh | 8 +-- lib/pigeon.rb | 8 +-- lib/pigeon/database.rb | 15 +++-- lib/pigeon/version.rb | 2 +- pigeon.db | Bin 0 -> 181 bytes spec/fixtures/normal.bundle | 99 --------------------------- spec/fixtures/x.bundle | 9 --- spec/pigeon/bundle_spec.rb | 4 +- spec/pigeon/lexer_spec.rb | 2 +- spec/pigeon/parser_spec.rb | 4 +- spec/pigeon/storage_spec.rb | 2 +- 17 files changed, 160 insertions(+), 138 deletions(-) create mode 100644 db.pigeon create mode 100644 gossip.pigeon create mode 100644 pigeon.db delete mode 100644 spec/fixtures/normal.bundle delete mode 100644 spec/fixtures/x.bundle diff --git a/.gitignore b/.gitignore index 16243e6..2ef66ec 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ coverage/ -.pigeon/ -*.pigeon +.pgn/ +*.pgn doc/ *scratchpad* pigeon.bundle diff --git a/README.md b/README.md index 7ab2077..d39de57 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ TODO # Optimizations - [ ] add parsers and validators for all CLI inputs - [ ] Make the switch to LevelDB, RocksDB, [UNQLite](https://unqlite.org/features.html) or similar (currently using Ruby PStore). - - [ ] Convert literals to constants, remove unused locals, reduce duplication. + - [ ] Convert literals to constants, remove unused locals, reduce duplication, run linter. - [ ] Reduce whole darn repo into single module to aide portability. `::Helpers` module is OK. - [ ] Update the bundles.md document once `bundle consume` works. - [ ] 100% documentation diff --git a/TODO.md b/TODO.md index 983482d..f544e6b 100644 --- a/TODO.md +++ b/TODO.md @@ -71,9 +71,9 @@ pigeon peer all # => @m0LEP+0NrGqu1wT8/4a3nOPuRBM+DrMpUahDZ3/cDi8=.ed25519 pigeon bundle create -# => (creates @GOl+398b2kWeLi6+DCcU0i3AWD6vWmUtocBVYbpkpNk=.ed25519.pigeon) +# => (creates @GOl+398b2kWeLi6+DCcU0i3AWD6vWmUtocBVYbpkpNk=.ed25519.pgn) -pigeon bundle consume @GOl+398b2kWeLi6+DCcU0i3AWD6vWmUtocBVYbpkpNk=.ed25519.pigeon +pigeon bundle consume @GOl+398b2kWeLi6+DCcU0i3AWD6vWmUtocBVYbpkpNk=.ed25519.pgn # => ``` diff --git a/bin/pigeon-cli b/bin/pigeon-cli index 4ca1596..95f6c46 100755 --- a/bin/pigeon-cli +++ b/bin/pigeon-cli @@ -29,7 +29,7 @@ module Pigeon class Identity < ThorBase class ConfigAlreadyExists < StandardError; end - desc "new", "Creates a new identiy in `.pigeon` directory if none exists" + desc "new", "Creates a new identiy in `.pgn` directory if none exists" def new if File.file?(Pigeon::PIGEON_DB_PATH) @@ -162,7 +162,7 @@ module Pigeon end class CLI < ThorBase - desc "status", "Show various information about the `.pigeon` directory" + desc "status", "Show various information about the `.pgn` directory" def status me = db.local_identity.multihash @@ -189,7 +189,7 @@ module Pigeon desc "draft SUBCOMMAND ...ARGS", "Manage drafts" subcommand "draft", PigeonDraft - desc "identity SUBCOMMAND ...ARGS", "Manage `.pigeon` identity" + desc "identity SUBCOMMAND ...ARGS", "Manage `.pgn` identity" subcommand "identity", Identity desc "message SUBCOMMAND ...ARGS", "Manage blob storage" diff --git a/db.pigeon b/db.pigeon new file mode 100644 index 0000000000000000000000000000000000000000..0c36c5de0dbb95092aa5fde0fba2ac00b59a90dc GIT binary patch literal 834 zcmb_byN=U96x{-O!)_oT5DlHBZ78hqE3uu%?^iUDEPV&%k>#M;CY{6HH;d;}lB zCm>N#Z_O9*2aBknq{GfC68+N6y)*aRbI-Z+ptV1D$o6cF=T|5pB*GYBsTH7-kj~^) zT&zBvm=5`HjmV=;y$Q&RC)KR@_4_jgK0Td&y#6NNd=+nge)+?{3vYki zzWx5nAv?CA=v0!&i?S&J4*6_@iXvX3f|}zhJ7o8SL#nc>y1^83LpxwtE#w2uHM#C| zsB*%)HM!>OuSJq-?MR~>jFaG^z^gyDHwY_QWB<qQN=1|_-+G&rRRRSL^zWqct^Y~wdJ@f zS2)Mg%j4Y;ZE%U41Z8Df?g*(PZ>n{fHVXca*=jRpIN3EqwH6pR#2oUBoW(iWoTYO) zLECbbp41Po(kyYv$5ob=mnA9=3fJjvj^5Yid9OX=P|}vy>2?#xbxlVu(q$HxRgN6; zngtPX!ye7K5v{R??u(F9L_rDRc&tQ literal 0 HcmV?d00001 diff --git a/gossip.pigeon b/gossip.pigeon new file mode 100644 index 0000000..67bda1d --- /dev/null +++ b/gossip.pigeon @@ -0,0 +1,129 @@ +author @3J01H00Z72F2HVCQK3AD1FY0VQY7VSWHP7BDKMDQ84YK6QC2DWWG.ed25519 +kind &ET9C7B9N82XR0F021CXEWSPDH23H4CHMX866WWA3R2PXEFZM67PG.sha256 +prev NONE +depth 0 +lipmaa 0 + +a:"b" + +signature XV7SCMN45EKYFQFZ4W5V3KCHN1B05DGQ3M9EJPBDTKMJHQ8ZG8133YXYRZD8AX29Q4JGQ0THXGJSRGQ5GQJZ7H69Z0Y608QKMF9E218.sig.ed25519 + +author @3J01H00Z72F2HVCQK3AD1FY0VQY7VSWHP7BDKMDQ84YK6QC2DWWG.ed25519 +kind a +prev %A15N6NKZ3ACBA2RW2082G8XMCHTF35E45CHD2X8S4KNR8V8CGG20.sha256 +depth 1 +lipmaa 0 + +&7Z2CSZKMB1RE5G6SKXRZ63ZGCNP8VVEM3K0XFMYKETRDQSM5WBSG.sha256:"b" + +signature 0RR1YFS0F1KYE0H304GZZJ4N0KY536N2GA5BFZCM4D4ZPJP48ACG16KXAK1357C52EY28KZ7T6NCQV9JWSGGV5BJ8191K9W7DNPWR28.sig.ed25519 + +author @3J01H00Z72F2HVCQK3AD1FY0VQY7VSWHP7BDKMDQ84YK6QC2DWWG.ed25519 +kind a +prev %XQPBM2Z4JSJMGHXN1AJE3PCZ7TT9SD9Z2FYFJYJDFKXV3XET5ZAG.sha256 +depth 2 +lipmaa 1 + +b:&HDDSVC617PS44NP856N3CJN91HPJXEHHHE93595BJC9VJN6KANFG.sha256 + +signature K52Y7ZT5VGPWNNXMYPBZE6BEZQYHHTQ50Z77JEMKESXX1VGDQKQ6ZG4W2EXGN3WXNHG652HXETKEBCM9ZZK0M6VG8Q08MQZK18K1J0G.sig.ed25519 + +author @3J01H00Z72F2HVCQK3AD1FY0VQY7VSWHP7BDKMDQ84YK6QC2DWWG.ed25519 +kind 4436caaa-b2a0-43a4-84a9-9b19397abd06 +prev %K7DF2RMFFYJ89HWWF2VGK7GXQ7D7THJSGXB0F6NMT5C6NPANQ3TG.sha256 +depth 3 +lipmaa 2 + +foo:"69675bb4-8c81-471e-b362-4aec2435e8b3" + +signature K3BRR2XPB16CQD79W72NRBQTA14YH14N6K1KDKP9BDW5V7C9RBZG2Z3HHA10BG16QW6GZ0N8K07XD1KP1KZMJEJRTYWSC2M3BN42P10.sig.ed25519 + +author @3J01H00Z72F2HVCQK3AD1FY0VQY7VSWHP7BDKMDQ84YK6QC2DWWG.ed25519 +kind ac549d0a-e636-46df-9499-7a618e695b40 +prev %NYGBV7HKXDV00EHHSRGNZRRWABERR6CJA2HD137DBXQBMN5ANZ70.sha256 +depth 4 +lipmaa 1 + +foo:"540a0b80-0f0e-4aaf-8983-7a866fce5092" + +signature M5P65CDBK6DWYDZTBXFEA6N982J0WZ9F8JN9SRE805B301K6VSB762MVTVKHBQGC022S5WCT4P0M251X9NCE1R1CJB35HD1G8XMS40R.sig.ed25519 + +author @3J01H00Z72F2HVCQK3AD1FY0VQY7VSWHP7BDKMDQ84YK6QC2DWWG.ed25519 +kind 5d33b10c-f084-44b4-9a00-7a9bc09761a4 +prev %6PAQD2Q4FRYCJWEAPQG3V3BW9S5WW7JDMRTJ085WK556JZGAX7M0.sha256 +depth 5 +lipmaa 4 + +foo:"bar" + +signature FF0DNPEXQP2A2BRJCQ5W1GQZ15YZ4H9A3Y6DGDR3APZ8CQWYSH4DJDA8EAT18V0BVQTE4WSB8HYE4QJ8WHCV7Y12X4ZQRQFB6VZ5630.sig.ed25519 + +author @3J01H00Z72F2HVCQK3AD1FY0VQY7VSWHP7BDKMDQ84YK6QC2DWWG.ed25519 +kind 264dbd6b-512f-44da-b7b5-8be2db432ceb +prev %93Y67BNW183KB2VAXXSC079NFME2Y2935AZGYSWA1QVSMPSWQSB0.sha256 +depth 6 +lipmaa 5 + +foo:"6c8024f8-92e4-4b71-81c1-f0105e0666f1" + +signature X39FH5B2HBRJ24CVRJJEV0WP2ZWGXDY9SSQZMNHTB6AEY5Q6NKZZ7HJ65WX9HBFMBGHDEXF6XC8G9A79VQM8QJ2E0HA4YPB3QPS5Y38.sig.ed25519 + +author @3J01H00Z72F2HVCQK3AD1FY0VQY7VSWHP7BDKMDQ84YK6QC2DWWG.ed25519 +kind 1c43d605-0c12-4d6e-b209-1a7514561787 +prev %Q84SMB8F5QHYMV7SCT5ZRQSJNMC81FJ6737T6T5ACK6FEZCN7TFG.sha256 +depth 7 +lipmaa 6 + +foo:"bar" + +signature 2Y3S6F7723V60CKNBRM95M30ZVNCYA5F675TTKMWKKQ2DVMAA204HKDJ5TDY9FDPR644GXJR48N04M96G7CHWXV4WHRP2HBN2V6XW20.sig.ed25519 + +author @3J01H00Z72F2HVCQK3AD1FY0VQY7VSWHP7BDKMDQ84YK6QC2DWWG.ed25519 +kind 3965b309-c3d4-4c3f-b71f-6f630b399b11 +prev %2RP9T2XWQ9KH40ZXVQF6XSAQ7JCBWN2VB5CN8850YHWW8GAX6N80.sha256 +depth 8 +lipmaa 4 + +foo:"123" + +signature 08EA0WNEEGJK7HRCZNHMAJJ501PE9N62JTTDYDFRHVHBGW3AEWNJT2J739HBWTRGBSJ3MZ8A4CPHCBXSM62DAZVBBMXHT3VCT6EY630.sig.ed25519 + +author @3J01H00Z72F2HVCQK3AD1FY0VQY7VSWHP7BDKMDQ84YK6QC2DWWG.ed25519 +kind a93e41cc-0cfc-4dec-a4d1-504156c4d739 +prev %TNP0G3EPEQNF2W050HKB7YS7XX3RHRSDBA61XFNFHYQCZDRH1D1G.sha256 +depth 9 +lipmaa 8 + +foo:"123" + +signature TQP1CHM8P79VE4S27J7C1XCDD2MJ0NNJ4SXK1PAW9AB52REQN9P9142HN0GC5CKV7V2ND5R8F9TE9NCCAEQYS4WEQGJBAWZ7YGSCY20.sig.ed25519 + +author @3J01H00Z72F2HVCQK3AD1FY0VQY7VSWHP7BDKMDQ84YK6QC2DWWG.ed25519 +kind 2b338d7f-a2d9-48ad-8455-ad8783621596 +prev %EQW115BK88001JTTWPFH8CWTYEWDYDAHDKXZAZXKGFKAB9SBH0XG.sha256 +depth 10 +lipmaa 9 + +foo:"bar" + +signature ZPF3H3VHWW4SR1K1AT4ZYBQ6A0SQEB9FGQEWSJ0DK2P0MFQEQHNNN5YH0CWZWF30HQ8ZZ7JW1C8A40RT9ZTDGJGVVDNDD0P16E4C80R.sig.ed25519 + +author @3J01H00Z72F2HVCQK3AD1FY0VQY7VSWHP7BDKMDQ84YK6QC2DWWG.ed25519 +kind cb448a72-0d4e-4a3f-bf88-e71c0938fe7e +prev %C4NNY31164R873NMKPTXK5QT22YAD8V921M7SMRKMDXDJJF45RM0.sha256 +depth 11 +lipmaa 10 + +foo:"bar" + +signature JQQH930EECHYKG4SNKDQ4RZAK9GXMAFP6FFNNZTMATH6CF7QJ9A1N83EWK0P6B31B9FQ520DXHSFTKEN22WCHD1KVGWWCV3Q52Z2M00.sig.ed25519 + +author @3J01H00Z72F2HVCQK3AD1FY0VQY7VSWHP7BDKMDQ84YK6QC2DWWG.ed25519 +kind 5e160f6d-c3cf-4132-9336-59c979b38428 +prev %E73R2HZ69F50WNMQWX8T3GB1XGHNHTP5N0BVVN042QP2KBV1PNNG.sha256 +depth 12 +lipmaa 8 + +foo:"123" + +signature SQ3PCJ1AZAK7X65FCRS9HX3B9N6ZZW0PTARTEP885KZTCM1N6YP8PTY62DCY5WC9W8J606VXQD6D40TP9V0QYQ5SM7PYFR9R2WEGM2R.sig.ed25519 diff --git a/kitchen_sink.sh b/kitchen_sink.sh index adc571f..b353f5f 100755 --- a/kitchen_sink.sh +++ b/kitchen_sink.sh @@ -5,8 +5,8 @@ # for quick QA. echo "Deleting old pigeon configs" -rm -f db.pigeon -rm -f pigeon.bundle +rm -f pigeon.db +rm -rf bundle echo "OK" echo "Creating new config:" @@ -80,9 +80,9 @@ echo "=== Sign draft #2" echo "=== Dump the bundle" ./bin/pigeon-cli bundle create -cat pigeon.bundle +cat bundle/gossip.pgn echo "=== end bundle dump. Ingesting bundle..." -./bin/pigeon-cli bundle ingest pigeon.bundle +./bin/pigeon-cli bundle ingest bundle/gossip.pgn echo "=== find a message" ./bin/pigeon-cli message find $(./bin/pigeon-cli message last) diff --git a/lib/pigeon.rb b/lib/pigeon.rb index 15d7df7..be336d8 100644 --- a/lib/pigeon.rb +++ b/lib/pigeon.rb @@ -7,8 +7,8 @@ module Pigeon SEED_CONFIG_KEY = "SEED" TPL_DIR = File.join(".", "lib", "views") - PIGEON_DB_PATH = File.join("db.pigeon") - DEFAULT_BUNDLE_PATH = File.join(Dir.home, "pigeon.bundle") + PIGEON_DB_PATH = File.join("pigeon.db") + DEFAULT_BUNDLE_PATH = File.join(Dir.pwd, "bundle") PIGEON_BLOB_PATH = File.join(Dir.home, "pigeon_sha256") # MESSAGE TEMPLATE CONSTANTS: HEADER_TPL = "author <%= author %>\nkind <%= kind %>\nprev <%= prev %>\ndepth <%= depth %>\nlipmaa <%= lipmaa %>\n\n" @@ -17,14 +17,14 @@ module Pigeon COMPLETE_TPL = [HEADER_TPL, BODY_TPL, FOOTER_TPL].join("") CURRENT_DRAFT = "HEAD.draft" NOTHING = "NONE" - OUTBOX_PATH = File.join(".pigeon", "user") + OUTBOX_PATH = File.join(".pgn", "user") DRAFT_PLACEHOLDER = "DRAFT" CR = "\n" BUNDLE_MESSAGE_SEPARATOR = CR * 2 # /MESSAGE TEMPLATE CONSTANTS # Internal namespaces for PStore keys: - ROOT_NS = ".pigeon" + ROOT_NS = ".pgn" CONF_NS = "conf" PEER_NS = "peers" USER_NS = "user" diff --git a/lib/pigeon/database.rb b/lib/pigeon/database.rb index e8c4acb..df5a338 100644 --- a/lib/pigeon/database.rb +++ b/lib/pigeon/database.rb @@ -102,22 +102,23 @@ module Pigeon .sort_by(&:depth) end.flatten - # Render messages for all peers. - content = messages - .map { |message| message.render } - .join(BUNDLE_MESSAGE_SEPARATOR) - File.write(file_path, content + CR) - + # Attach blobs for all messages in bundle. messages .map(&:collect_blobs) .flatten .uniq .map { |mhash| ["bundle", mhash, get_blob(mhash)] } .map { |arg| Helpers.write_to_disk(*arg) } + + # Render messages for all peers. + content = messages + .map { |message| message.render } + .join(BUNDLE_MESSAGE_SEPARATOR) + File.write(File.join(file_path, "gossip.pgn"), content + CR) end def ingest_bundle(file_path = DEFAULT_BUNDLE_PATH) - bundle = File.read(file_path) + bundle = File.read(File.join(file_path, "gossip.pgn")) tokens = Pigeon::Lexer.tokenize(bundle) Pigeon::Parser.parse(self, tokens) end diff --git a/lib/pigeon/version.rb b/lib/pigeon/version.rb index 91cb237..a149132 100644 --- a/lib/pigeon/version.rb +++ b/lib/pigeon/version.rb @@ -1,3 +1,3 @@ module Pigeon - VERSION = "0.0.7" + VERSION = "0.1.0" end diff --git a/pigeon.db b/pigeon.db new file mode 100644 index 0000000000000000000000000000000000000000..6e8b1a9e8faa796cc2d6931b770d968a50a9e40b GIT binary patch literal 181 zcmZSKsOI)m;z`QMPtHzFVY6a$4av9S2u>|wv*L2dNG#5%WpMLU;!MuZOJlQU2&rZR za)Mo5T|gWq)rNkHrri(DAK0?uz&7WdOOjb8pL?{