zold 0.2 → 0.3
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.
- checksums.yaml +4 -4
 - data/README.md +3 -1
 - data/bin/zold +21 -81
 - data/fixtures/keys/1.pub +1 -0
 - data/fixtures/keys/2 +51 -0
 - data/fixtures/keys/2.pub +1 -0
 - data/fixtures/scripts/print-helps.sh +15 -0
 - data/fixtures/scripts/push-and-pull.sh +7 -3
 - data/lib/zold/commands/clean.rb +24 -7
 - data/lib/zold/commands/create.rb +16 -4
 - data/lib/zold/commands/diff.rb +32 -9
 - data/lib/zold/commands/fetch.rb +36 -9
 - data/lib/zold/commands/invoice.rb +64 -0
 - data/lib/zold/commands/list.rb +1 -1
 - data/lib/zold/commands/merge.rb +31 -10
 - data/lib/zold/commands/node.rb +6 -2
 - data/lib/zold/commands/pay.rb +40 -17
 - data/lib/zold/commands/propagate.rb +34 -14
 - data/lib/zold/commands/push.rb +27 -9
 - data/lib/zold/commands/remote.rb +63 -34
 - data/lib/zold/commands/show.rb +34 -9
 - data/lib/zold/copies.rb +4 -0
 - data/lib/zold/http.rb +1 -1
 - data/lib/zold/key.rb +17 -11
 - data/lib/zold/node/farm.rb +8 -0
 - data/lib/zold/node/front.rb +13 -3
 - data/lib/zold/patch.rb +8 -8
 - data/lib/zold/prefixes.rb +53 -0
 - data/lib/zold/remotes.rb +6 -0
 - data/lib/zold/score.rb +4 -4
 - data/lib/zold/signature.rb +9 -9
 - data/lib/zold/txn.rb +111 -0
 - data/lib/zold/version.rb +1 -1
 - data/lib/zold/wallet.rb +32 -59
 - data/lib/zold/wallets.rb +2 -2
 - data/test/commands/test_clean.rb +5 -4
 - data/test/commands/test_create.rb +3 -3
 - data/test/commands/test_diff.rb +16 -15
 - data/test/commands/test_fetch.rb +13 -11
 - data/test/commands/test_invoice.rb +46 -0
 - data/test/commands/test_list.rb +4 -4
 - data/test/commands/test_merge.rb +21 -22
 - data/test/commands/test_node.rb +9 -9
 - data/test/commands/test_pay.rb +12 -12
 - data/test/commands/test_remote.rb +11 -11
 - data/test/commands/test_show.rb +9 -7
 - data/test/node/fake_node.rb +3 -3
 - data/test/node/test_farm.rb +1 -1
 - data/test/node/test_front.rb +6 -6
 - data/test/test_amount.rb +1 -1
 - data/test/test_copies.rb +1 -1
 - data/test/test_http.rb +1 -1
 - data/test/test_id.rb +1 -1
 - data/test/test_key.rb +19 -1
 - data/test/test_patch.rb +11 -11
 - data/test/test_prefixes.rb +46 -0
 - data/test/test_remotes.rb +1 -1
 - data/test/test_score.rb +1 -1
 - data/test/test_signature.rb +9 -11
 - data/test/test_wallet.rb +22 -21
 - data/test/test_wallets.rb +4 -4
 - metadata +12 -1
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: a1bcd34bba59aafa0887d0d1901844373598806a
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: cdc027656c02317a0087311135a89ea9d211a02a
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: abc7efeaf98c35608460d912a23c7d65b8b67b1bf9f6e5e5bdaea319f1c948873ac5280a66e6cee0417d3eb1e6bb99b46a24be98c42f8c295b4f0d6fb3464f2f
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 24b68ba90828a813e8c287b277bc9d1f599b8c4e15f3916aa85da6497d0deabc32ec67e24b7feab8f38dbd21fd994dbd6e1ac43f0678c631a8ea423cba0cb9fd
         
     | 
    
        data/README.md
    CHANGED
    
    
    
        data/bin/zold
    CHANGED
    
    | 
         @@ -54,12 +54,16 @@ Available commands: 
     | 
|
| 
       54 
54 
     | 
    
         
             
                  Remove expired local copies
         
     | 
| 
       55 
55 
     | 
    
         
             
                #{Rainbow('merge').green} [ID...]
         
     | 
| 
       56 
56 
     | 
    
         
             
                  Merge remote copies with the HEAD
         
     | 
| 
      
 57 
     | 
    
         
            +
                #{Rainbow('propagate').green} [ID...]
         
     | 
| 
      
 58 
     | 
    
         
            +
                  Propagate transactions to receiving wallets
         
     | 
| 
       57 
59 
     | 
    
         
             
                #{Rainbow('pull').green} [ID...]
         
     | 
| 
       58 
60 
     | 
    
         
             
                  Fetch and then merge
         
     | 
| 
       59 
61 
     | 
    
         
             
                #{Rainbow('show').green} [ID...]
         
     | 
| 
       60 
62 
     | 
    
         
             
                  Show all available information about the wallet
         
     | 
| 
       61 
     | 
    
         
            -
                #{Rainbow('pay').green}  
     | 
| 
      
 63 
     | 
    
         
            +
                #{Rainbow('pay').green} from to amount details
         
     | 
| 
       62 
64 
     | 
    
         
             
                  Pay ZOLD from one wallet to another
         
     | 
| 
      
 65 
     | 
    
         
            +
                #{Rainbow('invoice').green} ID
         
     | 
| 
      
 66 
     | 
    
         
            +
                  Generate invoice unique ID for a payment
         
     | 
| 
       63 
67 
     | 
    
         
             
                #{Rainbow('status').green}
         
     | 
| 
       64 
68 
     | 
    
         
             
                  Show status of local copies
         
     | 
| 
       65 
69 
     | 
    
         
             
                #{Rainbow('push').green} [ID...]
         
     | 
| 
         @@ -120,107 +124,43 @@ Available options:" 
     | 
|
| 
       120 
124 
     | 
    
         
             
                ).run(args)
         
     | 
| 
       121 
125 
     | 
    
         
             
              when 'remote'
         
     | 
| 
       122 
126 
     | 
    
         
             
                require_relative '../lib/zold/commands/remote'
         
     | 
| 
       123 
     | 
    
         
            -
                Zold::Remote.new(
         
     | 
| 
       124 
     | 
    
         
            -
             
     | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
       126 
     | 
    
         
            -
                ).run(args)
         
     | 
| 
      
 127 
     | 
    
         
            +
                Zold::Remote.new(remotes: remotes, log: log).run(args)
         
     | 
| 
      
 128 
     | 
    
         
            +
              when 'invoice'
         
     | 
| 
      
 129 
     | 
    
         
            +
                require_relative '../lib/zold/commands/invoice'
         
     | 
| 
      
 130 
     | 
    
         
            +
                Zold::Invoice.new(wallets: wallets, log: log).run(args)
         
     | 
| 
       127 
131 
     | 
    
         
             
              when 'pay'
         
     | 
| 
       128 
     | 
    
         
            -
                raise "Payer wallet ID is required" if args[0].nil?
         
     | 
| 
       129 
     | 
    
         
            -
                raise "Recepient wallet ID is required" if args[1].nil?
         
     | 
| 
       130 
     | 
    
         
            -
                raise "Amount is required (in Zolds)" if args[2].nil?
         
     | 
| 
       131 
132 
     | 
    
         
             
                require_relative '../lib/zold/commands/pay'
         
     | 
| 
       132 
133 
     | 
    
         
             
                Zold::Pay.new(
         
     | 
| 
       133 
     | 
    
         
            -
                   
     | 
| 
       134 
     | 
    
         
            -
                  receiver: Zold::Id.new(args[1]),
         
     | 
| 
       135 
     | 
    
         
            -
                  amount: Zold::Amount.new(zld: args[2].to_f),
         
     | 
| 
       136 
     | 
    
         
            -
                  details: opts.arguments[4] ? args[3] : '-',
         
     | 
| 
      
 134 
     | 
    
         
            +
                  wallets: wallets,
         
     | 
| 
       137 
135 
     | 
    
         
             
                  pvtkey: Zold::Key.new(file: opts['private-key']),
         
     | 
| 
       138 
136 
     | 
    
         
             
                  log: log
         
     | 
| 
       139 
137 
     | 
    
         
             
                ).run(args)
         
     | 
| 
       140 
138 
     | 
    
         
             
              when 'show'
         
     | 
| 
       141 
     | 
    
         
            -
                 
     | 
| 
       142 
     | 
    
         
            -
             
     | 
| 
       143 
     | 
    
         
            -
                  Zold::List.new(
         
     | 
| 
       144 
     | 
    
         
            -
                    wallets: wallets,
         
     | 
| 
       145 
     | 
    
         
            -
                    log: log
         
     | 
| 
       146 
     | 
    
         
            -
                  ).run(args)
         
     | 
| 
       147 
     | 
    
         
            -
                else
         
     | 
| 
       148 
     | 
    
         
            -
                  require_relative '../lib/zold/commands/show'
         
     | 
| 
       149 
     | 
    
         
            -
                  args.each do |id|
         
     | 
| 
       150 
     | 
    
         
            -
                    Zold::Show.new(
         
     | 
| 
       151 
     | 
    
         
            -
                      wallet: wallets.find(Zold::Id.new(id)),
         
     | 
| 
       152 
     | 
    
         
            -
                      log: log
         
     | 
| 
       153 
     | 
    
         
            -
                    ).run(args)
         
     | 
| 
       154 
     | 
    
         
            -
                  end
         
     | 
| 
       155 
     | 
    
         
            -
                end
         
     | 
| 
      
 139 
     | 
    
         
            +
                require_relative '../lib/zold/commands/show'
         
     | 
| 
      
 140 
     | 
    
         
            +
                Zold::Show.new(wallets: wallets, log: log).run(args)
         
     | 
| 
       156 
141 
     | 
    
         
             
              when 'fetch'
         
     | 
| 
       157 
142 
     | 
    
         
             
                require_relative '../lib/zold/commands/fetch'
         
     | 
| 
       158 
     | 
    
         
            -
                 
     | 
| 
       159 
     | 
    
         
            -
                  Zold::Fetch.new(
         
     | 
| 
       160 
     | 
    
         
            -
                    id: Zold::Id.new(id),
         
     | 
| 
       161 
     | 
    
         
            -
                    remotes: remotes,
         
     | 
| 
       162 
     | 
    
         
            -
                    copies: Zold::Copies.new(File.join(copies, id)),
         
     | 
| 
       163 
     | 
    
         
            -
                    log: log
         
     | 
| 
       164 
     | 
    
         
            -
                  ).run(args)
         
     | 
| 
       165 
     | 
    
         
            -
                end
         
     | 
| 
      
 143 
     | 
    
         
            +
                Zold::Fetch.new(remotes: remotes, copies: copies, log: log).run(args)
         
     | 
| 
       166 
144 
     | 
    
         
             
              when 'clean'
         
     | 
| 
       167 
145 
     | 
    
         
             
                require_relative '../lib/zold/commands/clean'
         
     | 
| 
       168 
     | 
    
         
            -
                 
     | 
| 
       169 
     | 
    
         
            -
                  args = Dir.new(copies).select { |f| f =~ /[0-9a-fA-F]{16}/ }
         
     | 
| 
       170 
     | 
    
         
            -
                end
         
     | 
| 
       171 
     | 
    
         
            -
                args.each do |id|
         
     | 
| 
       172 
     | 
    
         
            -
                  Zold::Clean.new(
         
     | 
| 
       173 
     | 
    
         
            -
                    copies: Zold::Copies.new(File.join(copies, id)),
         
     | 
| 
       174 
     | 
    
         
            -
                    log: log
         
     | 
| 
       175 
     | 
    
         
            -
                  ).run(args)
         
     | 
| 
       176 
     | 
    
         
            -
                end
         
     | 
| 
      
 146 
     | 
    
         
            +
                Zold::Clean.new(copies: copies, log: log).run(args)
         
     | 
| 
       177 
147 
     | 
    
         
             
              when 'diff'
         
     | 
| 
       178 
148 
     | 
    
         
             
                require_relative '../lib/zold/commands/diff'
         
     | 
| 
       179 
     | 
    
         
            -
                 
     | 
| 
       180 
     | 
    
         
            -
                  Zold::Diff.new(
         
     | 
| 
       181 
     | 
    
         
            -
                    wallet: wallets.find(Zold::Id.new(id)),
         
     | 
| 
       182 
     | 
    
         
            -
                    copies: Zold::Copies.new(File.join(copies, id)),
         
     | 
| 
       183 
     | 
    
         
            -
                    log: log
         
     | 
| 
       184 
     | 
    
         
            -
                  ).run(args)
         
     | 
| 
       185 
     | 
    
         
            -
                end
         
     | 
| 
      
 149 
     | 
    
         
            +
                Zold::Diff.new(wallets: wallets, copies: copies, log: log).run(args)
         
     | 
| 
       186 
150 
     | 
    
         
             
              when 'merge'
         
     | 
| 
       187 
151 
     | 
    
         
             
                require_relative '../lib/zold/commands/merge'
         
     | 
| 
      
 152 
     | 
    
         
            +
                Zold::Merge.new(wallets: wallets, copies: copies, log: log).run(args)
         
     | 
| 
      
 153 
     | 
    
         
            +
              when 'propagate'
         
     | 
| 
       188 
154 
     | 
    
         
             
                require_relative '../lib/zold/commands/propagate'
         
     | 
| 
       189 
     | 
    
         
            -
                 
     | 
| 
       190 
     | 
    
         
            -
                  Zold::Merge.new(
         
     | 
| 
       191 
     | 
    
         
            -
                    wallet: wallets.find(Zold::Id.new(id)),
         
     | 
| 
       192 
     | 
    
         
            -
                    copies: Zold::Copies.new(File.join(copies, id)),
         
     | 
| 
       193 
     | 
    
         
            -
                    log: log
         
     | 
| 
       194 
     | 
    
         
            -
                  ).run(args)
         
     | 
| 
       195 
     | 
    
         
            -
                  Zold::Propagate.new(
         
     | 
| 
       196 
     | 
    
         
            -
                    wallet: wallets.find(Zold::Id.new(id)),
         
     | 
| 
       197 
     | 
    
         
            -
                    wallets: wallets,
         
     | 
| 
       198 
     | 
    
         
            -
                    log: log
         
     | 
| 
       199 
     | 
    
         
            -
                  ).run(args)
         
     | 
| 
       200 
     | 
    
         
            -
                end
         
     | 
| 
      
 155 
     | 
    
         
            +
                Zold::Propagate.new(wallets: wallets, log: log).run(args)
         
     | 
| 
       201 
156 
     | 
    
         
             
              when 'pull'
         
     | 
| 
       202 
157 
     | 
    
         
             
                require_relative '../lib/zold/commands/fetch'
         
     | 
| 
      
 158 
     | 
    
         
            +
                Zold::Fetch.new(remotes: remotes, copies: copies, log: log).run(args)
         
     | 
| 
       203 
159 
     | 
    
         
             
                require_relative '../lib/zold/commands/merge'
         
     | 
| 
       204 
     | 
    
         
            -
                 
     | 
| 
       205 
     | 
    
         
            -
                  Zold::Fetch.new(
         
     | 
| 
       206 
     | 
    
         
            -
                    id: Zold::Id.new(id),
         
     | 
| 
       207 
     | 
    
         
            -
                    remotes: remotes,
         
     | 
| 
       208 
     | 
    
         
            -
                    copies: Zold::Copies.new(File.join(copies, id)),
         
     | 
| 
       209 
     | 
    
         
            -
                    log: log
         
     | 
| 
       210 
     | 
    
         
            -
                  ).run(args)
         
     | 
| 
       211 
     | 
    
         
            -
                  Zold::Merge.new(
         
     | 
| 
       212 
     | 
    
         
            -
                    wallet: wallets.find(Zold::Id.new(id)),
         
     | 
| 
       213 
     | 
    
         
            -
                    copies: Zold::Copies.new(File.join(copies, id)),
         
     | 
| 
       214 
     | 
    
         
            -
                    log: log
         
     | 
| 
       215 
     | 
    
         
            -
                  ).run(args)
         
     | 
| 
       216 
     | 
    
         
            -
                end
         
     | 
| 
      
 160 
     | 
    
         
            +
                Zold::Merge.new(wallets: wallets, copies: copies, log: log).run(args)
         
     | 
| 
       217 
161 
     | 
    
         
             
              when 'push'
         
     | 
| 
       218 
162 
     | 
    
         
             
                require_relative '../lib/zold/commands/push'
         
     | 
| 
       219 
     | 
    
         
            -
                Zold::Push.new(
         
     | 
| 
       220 
     | 
    
         
            -
                  wallet: wallets.find(Zold::Id.new(args[0])),
         
     | 
| 
       221 
     | 
    
         
            -
                  remotes: remotes,
         
     | 
| 
       222 
     | 
    
         
            -
                  log: log
         
     | 
| 
       223 
     | 
    
         
            -
                ).run(args)
         
     | 
| 
      
 163 
     | 
    
         
            +
                Zold::Push.new(wallets: wallets, remotes: remotes, log: log).run(args)
         
     | 
| 
       224 
164 
     | 
    
         
             
              when 'score'
         
     | 
| 
       225 
165 
     | 
    
         
             
                require_relative '../lib/zold/score'
         
     | 
| 
       226 
166 
     | 
    
         
             
                if args.length != 3
         
     | 
    
        data/fixtures/keys/1.pub
    ADDED
    
    | 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDFCn75hNu6+tmqn6NWtqrbN87WvlfRmGlyrUY0OLdofydrNUqEfhBzU+jPlYVM4TaMGs3mPxrhXbXhfEngZihzkQ08MJ/Sez0ecDMTsubsEVN6kDEQ3pPoCWo3YGHSsPQ8XYrufQMeqh/oCFlqXaLX5CLgjNk3q384mmdN/94JDpmsX+6nLdwhXRmgDQYSBZBJBq4nAgrjY0GC/g/k0GMshahI204xbNOlmqOvj8k2C7XYmTWAMEDtQMFedqIGHOw9dB2n6VOvLiVnfJty/u/HRuyHtZFYLt1/qhBhwousoD2gJKh7DJoOvzSnOMlIJ6TiIucx0PPR4co7Ioc2UOdjfV+srG3wte2bo48Hlbodt7AaVCJAoBldBws1+y2QkHKL+2qTIcqo0ucVEPISHT5fqA43U2njEh807pyG2oAq9BagzDKi6UgO1/4OOjsjJ+zaWAKtxjA9D8gH6JK5AG15eMhVOk4QhcWyQMNd1Wnrn6x8evkbrbbR+CoY9z1/jMBwFris9jR4OgEtNeQnahwkk24Ny21ibNZA37Yuo1I6/Fruy1FhbguIfOpoXH3MWJSWc6X91n6Fo2rTdQtPxy8KMr4bw7FYHw6iMTuVMJWuuqZQ+nADfQwxv+MxDRvLPOUSknmERjzFCO6MIPMZPZSvUmIhyYwojdXaaiMYIJYAMw== hi@example.com
         
     | 
    
        data/fixtures/keys/2
    ADDED
    
    | 
         @@ -0,0 +1,51 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            -----BEGIN RSA PRIVATE KEY-----
         
     | 
| 
      
 2 
     | 
    
         
            +
            MIIJKQIBAAKCAgEAyifZ77QNLfE3pN5ytuc9K4f76YdTAbpUNpm7oJSaZ7p3NSoj
         
     | 
| 
      
 3 
     | 
    
         
            +
            LnN8tS38L/VORCmyH/1Ae3R4eJcUh74lSj87OY11wwS2ojjhEAIGtJlvuDo2X8bd
         
     | 
| 
      
 4 
     | 
    
         
            +
            7DMqKt3pzDd5GPPzl0/wskpEn4+2xeqXcsZ/c6ujk/pUqFfG4GFgxestYjblebjU
         
     | 
| 
      
 5 
     | 
    
         
            +
            lHRtIz93LdDMZ0zsl3lIWd76ydoUafzeRxF86oPHvM8v/8QeJ3C3JRu1grot/WPX
         
     | 
| 
      
 6 
     | 
    
         
            +
            R5mrUeO6htskDDnouD3MG4dy86sPSp7cOh2GDHH9R64S1+1UyzBQULcZ48V13wrl
         
     | 
| 
      
 7 
     | 
    
         
            +
            W6BDA6fQ7e2BzzblQk75p4/8Qd8SDhWZEzT0H3cdJB9ibEJJ4w2Tzpf4KFd63Aa2
         
     | 
| 
      
 8 
     | 
    
         
            +
            0taaoghTgq6NloQYVlMVtEHiCwwzHBZ9UtdYriU5qxmTV1dh4fAExf/wVJEoT3At
         
     | 
| 
      
 9 
     | 
    
         
            +
            zEtylByo6O6184PAubobHDOlIllpEWSy4gt5O6uetpeC1MzJ0efm0echOXf6xesF
         
     | 
| 
      
 10 
     | 
    
         
            +
            iOgz6Ilz5xaD/lG3GfeiAUQN7ZNW8+vCzxiuD6Yj3F4wOk/AbndzHThM4XyD1lMa
         
     | 
| 
      
 11 
     | 
    
         
            +
            p6PUV6cDX68q6rAn5FU80wx6DS4Ax6E2ORQ5OT1jpcd3cPEXNSQDxKgHHWoJuwoH
         
     | 
| 
      
 12 
     | 
    
         
            +
            mpP3I1dCVW08UG90VzqnTwU52nCJuhzRFnG450L8dvf/FPUQpHdLz3yVqUUCAwEA
         
     | 
| 
      
 13 
     | 
    
         
            +
            AQKCAgEArMsXe855HXX7zA7gGvrYzGa1qs0i5G0yImGRgRbETDmUP3s/Cytnwy4F
         
     | 
| 
      
 14 
     | 
    
         
            +
            S7DwL088lB9SiLPrbZgl0klzcl1N8Em8CO/0dAEOTzKMLL6iQeRwKbnAY27wciew
         
     | 
| 
      
 15 
     | 
    
         
            +
            +f/IoM2Uvxdzc9ILih+7aLy2q0KEGojxj0EAL8ynj49sun/lEPg/eaXE/wftaZ2L
         
     | 
| 
      
 16 
     | 
    
         
            +
            7zt0HDAiYu8mKrtvvi2MGXQtQq3uCj6N8hNewc4OwEOWKD/hDFa7jMVUdD0jtSFk
         
     | 
| 
      
 17 
     | 
    
         
            +
            hHS4AUNWanVYC4fhd+oVbgEP2RT3SZf9mNFwBeU0/2DSpct8c7aKpBWaKpF39p3w
         
     | 
| 
      
 18 
     | 
    
         
            +
            9g53UHlpyR3cQ5/NTTixJBzN9R7kMqQdAnqmX4RWZG0K7kZ+umvGpJDVKXWDCNAL
         
     | 
| 
      
 19 
     | 
    
         
            +
            0RF+mVxKlRHGdDbJ+HfQoXqVo6x0vulQG/bk7HCrG4Uo+Gexb/HvxxQchWceZkQO
         
     | 
| 
      
 20 
     | 
    
         
            +
            XA99NmbIfRArXDiHnGe9LHWbIEe+Rim6pqT5cpsUukXNATL9rPI3sxITdde+eynM
         
     | 
| 
      
 21 
     | 
    
         
            +
            LJdMIx6D+wvl4S1l2DdTRK37LTWS3X24yrKyHhZ6AtUdvsf0T9j1wscNrmYZCxcR
         
     | 
| 
      
 22 
     | 
    
         
            +
            AEQG28gUk1m2KdA65lX8WPV2FTntIug1UVDXCRtoVDYbt7z0X6Yoryuh4NZHXU2Z
         
     | 
| 
      
 23 
     | 
    
         
            +
            J2lapjHvg84MDJ1NqCCd1BL2rNnS8UpW53zkrpFYKUIqc722jpkCggEBAOZeH1UT
         
     | 
| 
      
 24 
     | 
    
         
            +
            vBFy93jbpPzjm8qpjqkg6hboKMS3RAWujDhw0bSvdT2JCZdET2FC2kzGDSo1OzON
         
     | 
| 
      
 25 
     | 
    
         
            +
            S/sJ9vAh34CSk1Ru3ZDyAcBJnlXx7l8hqmrGu+o6cVSzdvGjfo7MFa7iwmAPvmGU
         
     | 
| 
      
 26 
     | 
    
         
            +
            c/XrDU4lid0atpGcBeogWZe+mizIOjbhCcWsw8WwZgk9uNv3kYpEHLDstHjgp6jo
         
     | 
| 
      
 27 
     | 
    
         
            +
            QHyFGSOoXYFfkyHquTToL1K543T0EKtDCIywatEuMQYXC4PYC9MYxxYI6AK0V2s2
         
     | 
| 
      
 28 
     | 
    
         
            +
            7V1GqkStvSl1JOmo0V8YCI/2bPtSWd07+baF12y4fHtuE3v6UK3+jePSdK3OU/AI
         
     | 
| 
      
 29 
     | 
    
         
            +
            Zr2yknafdjjg4nMCggEBAOCmIMTkhKdy3K95kPsb21V4c5T7326iCeOlvsSVwvap
         
     | 
| 
      
 30 
     | 
    
         
            +
            mthr+hin3kmPEkQr7+0ucvX1Uq7JeigcYTId+UI9Oj5TPNMNR8VyOCXzKiKEEmLS
         
     | 
| 
      
 31 
     | 
    
         
            +
            sMTFSqfLZXzqEYCLtdrvfOfIjKKyHubLg1uBngcNC/G/Edo9d7lwF5p8pgxo4Nj3
         
     | 
| 
      
 32 
     | 
    
         
            +
            TzQfvWE5RWQsnK29o1kx79NlxWnmiBgqIph50LwFpYZOlom+lmNeEMoOZdCNdoes
         
     | 
| 
      
 33 
     | 
    
         
            +
            1gwNX6+Eh3W9EffQ0numl9s8T09oqCA72Mwfz92kpAvTJYOz1r9CsgEOn8ue6MaP
         
     | 
| 
      
 34 
     | 
    
         
            +
            gl2YRgPUuk3uN5IuavmpKMpRnmlr+b+akI/E5iDO/2cCggEALWL96VUqCIYOG9Gq
         
     | 
| 
      
 35 
     | 
    
         
            +
            f+iYGSWu5cOGW10CKz+wNy5ckgIoTuECyEznhtX+jbsOJ3IdxeMW9uEvxxX/gPAr
         
     | 
| 
      
 36 
     | 
    
         
            +
            iLlYLZpqLNSBY9EdUPGJdVS8rqzY+RzqlzWEibcciCXNX9dtVF/FspP9BMZ6qJrc
         
     | 
| 
      
 37 
     | 
    
         
            +
            vqM0tRt4TthwzmTPG2OXlJhhxIB1Uc2fTNLMSQpNsmAZBwKby/T3E2Au1FmkylGx
         
     | 
| 
      
 38 
     | 
    
         
            +
            mnuqEVSdiL72E+Zr2e78GcHrPUzEvtHK9tgzfJZkPgLztnOqwl2lm4oG2gnCIiXY
         
     | 
| 
      
 39 
     | 
    
         
            +
            zwI1c5O/LG0fwr1aW2muKthWKo/UEaeHXwog7Jw0qRMuAWTFeDjecLw3Acjc8mIY
         
     | 
| 
      
 40 
     | 
    
         
            +
            eLxV4QKCAQA+YEJXCTCAIhd+rZ2A69Ix4DkPlAQM/vcJ+5qFkSPKQ3uYPhr6P5os
         
     | 
| 
      
 41 
     | 
    
         
            +
            CIrE3QJIdA49lvl3SMAfZQnj1YjBSKjkZ05LN7PG8hj/CI6ZeNx2DhRA/prlDkfG
         
     | 
| 
      
 42 
     | 
    
         
            +
            sGNdsu0yti6TWQ8bmaOU58s4XDwZrxiy7h+x3kFg/uu+3H9qkLBl7f1S9sEpvrIy
         
     | 
| 
      
 43 
     | 
    
         
            +
            x2RVpYM2n/P8WZS/+9+r/f8PITvBCTxVl3qbEo1FV/gHcon4p17S+z2PqSL5ZC4M
         
     | 
| 
      
 44 
     | 
    
         
            +
            lgvoKFZZOP+PQyauYNvV32gp/WdFHpLiKaWP9R5aitVMD9h0vFHb2DsVa9N8+tMk
         
     | 
| 
      
 45 
     | 
    
         
            +
            ElHhx/uyCLMnwhPfJ7j3553eHYjccT1fAoIBAQDK4hz8fFHSq8p7mL5Nwwl1yMPg
         
     | 
| 
      
 46 
     | 
    
         
            +
            kD0uHOEnTvlyM2+lqSrZev/2H2R6SLfjA7S2SC35N64CVspGXVSBU0ZFzwms3WC3
         
     | 
| 
      
 47 
     | 
    
         
            +
            V6ctR6PZtyx1WlRwCqfU60x2q0LyX8Ljh1y2TUx4/kL1zwtZjYhdVDFJhBgbYSiE
         
     | 
| 
      
 48 
     | 
    
         
            +
            Ho8/kJKhGA3VOJlv+aIFkfwhwL1573RLtatwlBcmOyppHOHXPJYTKgyMu9Djwxqm
         
     | 
| 
      
 49 
     | 
    
         
            +
            8OCuyYUMPOG0QJKUwu+Z0SFyGTtGKFhDOEbsvguye0qOlYtGhL9X9RAFEyXo085V
         
     | 
| 
      
 50 
     | 
    
         
            +
            aaooZQTFfto8CQ5EdXr7/ijuq4wFQz1VQfDInUuxKE7YGEEdGe8kPbMpEdfd
         
     | 
| 
      
 51 
     | 
    
         
            +
            -----END RSA PRIVATE KEY-----
         
     | 
    
        data/fixtures/keys/2.pub
    ADDED
    
    | 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDKJ9nvtA0t8Tek3nK25z0rh/vph1MBulQ2mbuglJpnunc1KiMuc3y1Lfwv9U5EKbIf/UB7dHh4lxSHviVKPzs5jXXDBLaiOOEQAga0mW+4OjZfxt3sMyoq3enMN3kY8/OXT/CySkSfj7bF6pdyxn9zq6OT+lSoV8bgYWDF6y1iNuV5uNSUdG0jP3ct0MxnTOyXeUhZ3vrJ2hRp/N5HEXzqg8e8zy//xB4ncLclG7WCui39Y9dHmatR47qG2yQMOei4Pcwbh3Lzqw9Kntw6HYYMcf1HrhLX7VTLMFBQtxnjxXXfCuVboEMDp9Dt7YHPNuVCTvmnj/xB3xIOFZkTNPQfdx0kH2JsQknjDZPOl/goV3rcBrbS1pqiCFOCro2WhBhWUxW0QeILDDMcFn1S11iuJTmrGZNXV2Hh8ATF//BUkShPcC3MS3KUHKjo7rXzg8C5uhscM6UiWWkRZLLiC3k7q562l4LUzMnR5+bR5yE5d/rF6wWI6DPoiXPnFoP+UbcZ96IBRA3tk1bz68LPGK4PpiPcXjA6T8Bud3MdOEzhfIPWUxqno9RXpwNfryrqsCfkVTzTDHoNLgDHoTY5FDk5PWOlx3dw8Rc1JAPEqAcdagm7Cgeak/cjV0JVbTxQb3RXOqdPBTnacIm6HNEWcbjnQvx29/8U9RCkd0vPfJWpRQ== yegor256@gmail.com
         
     | 
| 
         @@ -0,0 +1,15 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/bin/bash
         
     | 
| 
      
 2 
     | 
    
         
            +
            set -x
         
     | 
| 
      
 3 
     | 
    
         
            +
            set -e
         
     | 
| 
      
 4 
     | 
    
         
            +
            shopt -s expand_aliases
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            alias zold="$1"
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            zold --help
         
     | 
| 
      
 9 
     | 
    
         
            +
            declare -a commands=(node create invoice remote pay show fetch clean diff merge propagate pull push)
         
     | 
| 
      
 10 
     | 
    
         
            +
            for c in "${commands[@]}"
         
     | 
| 
      
 11 
     | 
    
         
            +
            do
         
     | 
| 
      
 12 
     | 
    
         
            +
              zold --trace $c --help
         
     | 
| 
      
 13 
     | 
    
         
            +
            done
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            echo 'DONE'
         
     | 
| 
         @@ -23,13 +23,17 @@ zold remote add localhost ${port} 
     | 
|
| 
       23 
23 
     | 
    
         
             
            zold remote show
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
            zold --public-key id_rsa.pub create 0000000000000000
         
     | 
| 
       26 
     | 
    
         
            -
            zold -- 
     | 
| 
      
 26 
     | 
    
         
            +
            target=`zold --public-key id_rsa.pub create`
         
     | 
| 
      
 27 
     | 
    
         
            +
            invoice=`zold invoice ${target}`
         
     | 
| 
      
 28 
     | 
    
         
            +
            zold --private-key id_rsa pay 0000000000000000 ${invoice} 14.99 'To save the world!'
         
     | 
| 
      
 29 
     | 
    
         
            +
            zold propagate 0000000000000000
         
     | 
| 
       27 
30 
     | 
    
         
             
            zold show
         
     | 
| 
       28 
31 
     | 
    
         
             
            zold show 0000000000000000
         
     | 
| 
       29 
32 
     | 
    
         | 
| 
       30 
33 
     | 
    
         
             
            zold push 0000000000000000
         
     | 
| 
       31 
     | 
    
         
            -
            zold fetch 0000000000000000
         
     | 
| 
      
 34 
     | 
    
         
            +
            zold fetch 0000000000000000 --ignore-score-weakness
         
     | 
| 
       32 
35 
     | 
    
         
             
            zold diff 0000000000000000
         
     | 
| 
       33 
     | 
    
         
            -
            zold  
     | 
| 
      
 36 
     | 
    
         
            +
            zold merge 0000000000000000
         
     | 
| 
      
 37 
     | 
    
         
            +
            zold clean 0000000000000000
         
     | 
| 
       34 
38 
     | 
    
         | 
| 
       35 
39 
     | 
    
         
             
            echo 'DONE'
         
     | 
    
        data/lib/zold/commands/clean.rb
    CHANGED
    
    | 
         @@ -21,9 +21,10 @@ 
     | 
|
| 
       21 
21 
     | 
    
         
             
            require 'uri'
         
     | 
| 
       22 
22 
     | 
    
         
             
            require 'json'
         
     | 
| 
       23 
23 
     | 
    
         
             
            require 'time'
         
     | 
| 
       24 
     | 
    
         
            -
            require_relative '../log 
     | 
| 
       25 
     | 
    
         
            -
            require_relative '../http 
     | 
| 
       26 
     | 
    
         
            -
            require_relative '../score 
     | 
| 
      
 24 
     | 
    
         
            +
            require_relative '../log'
         
     | 
| 
      
 25 
     | 
    
         
            +
            require_relative '../http'
         
     | 
| 
      
 26 
     | 
    
         
            +
            require_relative '../score'
         
     | 
| 
      
 27 
     | 
    
         
            +
            require_relative '../copies'
         
     | 
| 
       27 
28 
     | 
    
         | 
| 
       28 
29 
     | 
    
         
             
            # CLEAN command.
         
     | 
| 
       29 
30 
     | 
    
         
             
            # Author:: Yegor Bugayenko (yegor256@gmail.com)
         
     | 
| 
         @@ -37,10 +38,26 @@ module Zold 
     | 
|
| 
       37 
38 
     | 
    
         
             
                  @log = log
         
     | 
| 
       38 
39 
     | 
    
         
             
                end
         
     | 
| 
       39 
40 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
                def run( 
     | 
| 
       41 
     | 
    
         
            -
                   
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
      
 41 
     | 
    
         
            +
                def run(args = [])
         
     | 
| 
      
 42 
     | 
    
         
            +
                  opts = Slop.parse(args, help: true) do |o|
         
     | 
| 
      
 43 
     | 
    
         
            +
                    o.banner = "Usage: zold clean [ID...] [options]
         
     | 
| 
      
 44 
     | 
    
         
            +
            Available options:"
         
     | 
| 
      
 45 
     | 
    
         
            +
                    o.bool '--help', 'Print instructions'
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
                  if opts.help?
         
     | 
| 
      
 48 
     | 
    
         
            +
                    @log.info(opts.to_s)
         
     | 
| 
      
 49 
     | 
    
         
            +
                    return
         
     | 
| 
      
 50 
     | 
    
         
            +
                  end
         
     | 
| 
      
 51 
     | 
    
         
            +
                  raise 'At least one wallet ID is required' if opts.arguments.empty?
         
     | 
| 
      
 52 
     | 
    
         
            +
                  opts.arguments.each do |id|
         
     | 
| 
      
 53 
     | 
    
         
            +
                    clean(Copies.new(File.join(@copies, id)), opts)
         
     | 
| 
      
 54 
     | 
    
         
            +
                  end
         
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                def clean(cps, _)
         
     | 
| 
      
 58 
     | 
    
         
            +
                  cps.clean
         
     | 
| 
      
 59 
     | 
    
         
            +
                  @log.debug("Expired local copies removed for #{cps}, \
         
     | 
| 
      
 60 
     | 
    
         
            +
            #{cps.all.count} left")
         
     | 
| 
       44 
61 
     | 
    
         
             
                end
         
     | 
| 
       45 
62 
     | 
    
         
             
              end
         
     | 
| 
       46 
63 
     | 
    
         
             
            end
         
     | 
    
        data/lib/zold/commands/create.rb
    CHANGED
    
    | 
         @@ -18,9 +18,9 @@ 
     | 
|
| 
       18 
18 
     | 
    
         
             
            # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
         
     | 
| 
       19 
19 
     | 
    
         
             
            # SOFTWARE.
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
     | 
    
         
            -
            require_relative '../wallet 
     | 
| 
       22 
     | 
    
         
            -
            require_relative '../log 
     | 
| 
       23 
     | 
    
         
            -
            require_relative '../id 
     | 
| 
      
 21 
     | 
    
         
            +
            require_relative '../wallet'
         
     | 
| 
      
 22 
     | 
    
         
            +
            require_relative '../log'
         
     | 
| 
      
 23 
     | 
    
         
            +
            require_relative '../id'
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
            # CREATE command.
         
     | 
| 
       26 
26 
     | 
    
         
             
            # Author:: Yegor Bugayenko (yegor256@gmail.com)
         
     | 
| 
         @@ -36,7 +36,19 @@ module Zold 
     | 
|
| 
       36 
36 
     | 
    
         
             
                end
         
     | 
| 
       37 
37 
     | 
    
         | 
| 
       38 
38 
     | 
    
         
             
                def run(args = [])
         
     | 
| 
       39 
     | 
    
         
            -
                   
     | 
| 
      
 39 
     | 
    
         
            +
                  opts = Slop.parse(args, help: true) do |o|
         
     | 
| 
      
 40 
     | 
    
         
            +
                    o.banner = "Usage: zold create [options]
         
     | 
| 
      
 41 
     | 
    
         
            +
            Available options:"
         
     | 
| 
      
 42 
     | 
    
         
            +
                    o.bool '--help', 'Print instructions'
         
     | 
| 
      
 43 
     | 
    
         
            +
                  end
         
     | 
| 
      
 44 
     | 
    
         
            +
                  if opts.help?
         
     | 
| 
      
 45 
     | 
    
         
            +
                    @log.info(opts.to_s)
         
     | 
| 
      
 46 
     | 
    
         
            +
                    return
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
                  create(opts.arguments.empty? ? Id.new : Id.new(opts.arguments[0]), opts)
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                def create(id, _)
         
     | 
| 
       40 
52 
     | 
    
         
             
                  wallet = @wallets.find(id)
         
     | 
| 
       41 
53 
     | 
    
         
             
                  wallet.init(id, @pubkey)
         
     | 
| 
       42 
54 
     | 
    
         
             
                  @log.info(wallet.id)
         
     | 
    
        data/lib/zold/commands/diff.rb
    CHANGED
    
    | 
         @@ -19,10 +19,11 @@ 
     | 
|
| 
       19 
19 
     | 
    
         
             
            # SOFTWARE.
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
            require 'tempfile'
         
     | 
| 
      
 22 
     | 
    
         
            +
            require 'slop'
         
     | 
| 
       22 
23 
     | 
    
         
             
            require 'diffy'
         
     | 
| 
       23 
     | 
    
         
            -
            require_relative '../log 
     | 
| 
       24 
     | 
    
         
            -
            require_relative '../patch 
     | 
| 
       25 
     | 
    
         
            -
            require_relative '../wallet 
     | 
| 
      
 24 
     | 
    
         
            +
            require_relative '../log'
         
     | 
| 
      
 25 
     | 
    
         
            +
            require_relative '../patch'
         
     | 
| 
      
 26 
     | 
    
         
            +
            require_relative '../wallet'
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
28 
     | 
    
         
             
            # DIFF command.
         
     | 
| 
       28 
29 
     | 
    
         
             
            # Author:: Yegor Bugayenko (yegor256@gmail.com)
         
     | 
| 
         @@ -31,21 +32,43 @@ require_relative '../wallet.rb' 
     | 
|
| 
       31 
32 
     | 
    
         
             
            module Zold
         
     | 
| 
       32 
33 
     | 
    
         
             
              # DIFF pulling command
         
     | 
| 
       33 
34 
     | 
    
         
             
              class Diff
         
     | 
| 
       34 
     | 
    
         
            -
                def initialize( 
     | 
| 
       35 
     | 
    
         
            -
                  @ 
     | 
| 
      
 35 
     | 
    
         
            +
                def initialize(wallets:, copies:, log: Log::Quiet.new)
         
     | 
| 
      
 36 
     | 
    
         
            +
                  @wallets = wallets
         
     | 
| 
       36 
37 
     | 
    
         
             
                  @copies = copies
         
     | 
| 
       37 
38 
     | 
    
         
             
                  @log = log
         
     | 
| 
       38 
39 
     | 
    
         
             
                end
         
     | 
| 
       39 
40 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
                def run( 
     | 
| 
       41 
     | 
    
         
            -
                   
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
      
 41 
     | 
    
         
            +
                def run(args = [])
         
     | 
| 
      
 42 
     | 
    
         
            +
                  opts = Slop.parse(args, help: true) do |o|
         
     | 
| 
      
 43 
     | 
    
         
            +
                    o.banner = "Usage: zold diff [ID...] [options]
         
     | 
| 
      
 44 
     | 
    
         
            +
            Available options:"
         
     | 
| 
      
 45 
     | 
    
         
            +
                    o.bool '--help', 'Print instructions'
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
                  if opts.help?
         
     | 
| 
      
 48 
     | 
    
         
            +
                    @log.info(opts.to_s)
         
     | 
| 
      
 49 
     | 
    
         
            +
                    return
         
     | 
| 
      
 50 
     | 
    
         
            +
                  end
         
     | 
| 
      
 51 
     | 
    
         
            +
                  raise 'At least one wallet ID is required' if opts.arguments.empty?
         
     | 
| 
      
 52 
     | 
    
         
            +
                  stdout = ''
         
     | 
| 
      
 53 
     | 
    
         
            +
                  opts.arguments.each do |id|
         
     | 
| 
      
 54 
     | 
    
         
            +
                    stdout += diff(
         
     | 
| 
      
 55 
     | 
    
         
            +
                      @wallets.find(Id.new(id)),
         
     | 
| 
      
 56 
     | 
    
         
            +
                      Copies.new(File.join(@copies, id)),
         
     | 
| 
      
 57 
     | 
    
         
            +
                      opts
         
     | 
| 
      
 58 
     | 
    
         
            +
                    )
         
     | 
| 
      
 59 
     | 
    
         
            +
                  end
         
     | 
| 
      
 60 
     | 
    
         
            +
                  stdout
         
     | 
| 
      
 61 
     | 
    
         
            +
                end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                def diff(wallet, cps, _)
         
     | 
| 
      
 64 
     | 
    
         
            +
                  raise 'There are no remote copies, try FETCH first' if cps.all.empty?
         
     | 
| 
      
 65 
     | 
    
         
            +
                  cps = cps.all.sort_by { |c| c[:score] }.reverse
         
     | 
| 
       43 
66 
     | 
    
         
             
                  patch = Patch.new
         
     | 
| 
       44 
67 
     | 
    
         
             
                  patch.start(Wallet.new(cps[0][:path]))
         
     | 
| 
       45 
68 
     | 
    
         
             
                  cps[1..-1].each do |c|
         
     | 
| 
       46 
69 
     | 
    
         
             
                    patch.join(Wallet.new(c[:path]))
         
     | 
| 
       47 
70 
     | 
    
         
             
                  end
         
     | 
| 
       48 
     | 
    
         
            -
                  before = File.read( 
     | 
| 
      
 71 
     | 
    
         
            +
                  before = File.read(wallet.path)
         
     | 
| 
       49 
72 
     | 
    
         
             
                  after = ''
         
     | 
| 
       50 
73 
     | 
    
         
             
                  Tempfile.open do |f|
         
     | 
| 
       51 
74 
     | 
    
         
             
                    patch.save(f, overwrite: true)
         
     | 
    
        data/lib/zold/commands/fetch.rb
    CHANGED
    
    | 
         @@ -21,9 +21,11 @@ 
     | 
|
| 
       21 
21 
     | 
    
         
             
            require 'uri'
         
     | 
| 
       22 
22 
     | 
    
         
             
            require 'json'
         
     | 
| 
       23 
23 
     | 
    
         
             
            require 'time'
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
            require_relative '../ 
     | 
| 
       26 
     | 
    
         
            -
            require_relative '../ 
     | 
| 
      
 24 
     | 
    
         
            +
            require 'slop'
         
     | 
| 
      
 25 
     | 
    
         
            +
            require_relative '../log'
         
     | 
| 
      
 26 
     | 
    
         
            +
            require_relative '../http'
         
     | 
| 
      
 27 
     | 
    
         
            +
            require_relative '../score'
         
     | 
| 
      
 28 
     | 
    
         
            +
            require_relative '../copies'
         
     | 
| 
       27 
29 
     | 
    
         | 
| 
       28 
30 
     | 
    
         
             
            # FETCH command.
         
     | 
| 
       29 
31 
     | 
    
         
             
            # Author:: Yegor Bugayenko (yegor256@gmail.com)
         
     | 
| 
         @@ -32,17 +34,35 @@ require_relative '../score.rb' 
     | 
|
| 
       32 
34 
     | 
    
         
             
            module Zold
         
     | 
| 
       33 
35 
     | 
    
         
             
              # FETCH pulling command
         
     | 
| 
       34 
36 
     | 
    
         
             
              class Fetch
         
     | 
| 
       35 
     | 
    
         
            -
                def initialize( 
     | 
| 
       36 
     | 
    
         
            -
                  @id = id
         
     | 
| 
      
 37 
     | 
    
         
            +
                def initialize(remotes:, copies:, log: Log::Quiet.new)
         
     | 
| 
       37 
38 
     | 
    
         
             
                  @remotes = remotes
         
     | 
| 
       38 
39 
     | 
    
         
             
                  @copies = copies
         
     | 
| 
       39 
40 
     | 
    
         
             
                  @log = log
         
     | 
| 
       40 
41 
     | 
    
         
             
                end
         
     | 
| 
       41 
42 
     | 
    
         | 
| 
       42 
     | 
    
         
            -
                def run( 
     | 
| 
      
 43 
     | 
    
         
            +
                def run(args = [])
         
     | 
| 
      
 44 
     | 
    
         
            +
                  opts = Slop.parse(args, help: true) do |o|
         
     | 
| 
      
 45 
     | 
    
         
            +
                    o.banner = "Usage: zold fetch [ID...] [options]
         
     | 
| 
      
 46 
     | 
    
         
            +
            Available options:"
         
     | 
| 
      
 47 
     | 
    
         
            +
                    o.bool '--ignore-score-weakness',
         
     | 
| 
      
 48 
     | 
    
         
            +
                      'Don\'t complain when their score is too weak',
         
     | 
| 
      
 49 
     | 
    
         
            +
                      default: false
         
     | 
| 
      
 50 
     | 
    
         
            +
                    o.bool '--help', 'Print instructions'
         
     | 
| 
      
 51 
     | 
    
         
            +
                  end
         
     | 
| 
      
 52 
     | 
    
         
            +
                  if opts.help?
         
     | 
| 
      
 53 
     | 
    
         
            +
                    @log.info(opts.to_s)
         
     | 
| 
      
 54 
     | 
    
         
            +
                    return
         
     | 
| 
      
 55 
     | 
    
         
            +
                  end
         
     | 
| 
      
 56 
     | 
    
         
            +
                  raise 'At least one wallet ID is required' if opts.arguments.empty?
         
     | 
| 
      
 57 
     | 
    
         
            +
                  opts.arguments.each do |id|
         
     | 
| 
      
 58 
     | 
    
         
            +
                    fetch(id, Copies.new(File.join(@copies, id)), opts)
         
     | 
| 
      
 59 
     | 
    
         
            +
                  end
         
     | 
| 
      
 60 
     | 
    
         
            +
                end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                def fetch(id, cps, opts)
         
     | 
| 
       43 
63 
     | 
    
         
             
                  total = 0
         
     | 
| 
       44 
64 
     | 
    
         
             
                  @remotes.all.each do |r|
         
     | 
| 
       45 
     | 
    
         
            -
                    uri = URI("#{r[:home]}wallet/#{ 
     | 
| 
      
 65 
     | 
    
         
            +
                    uri = URI("#{r[:home]}wallet/#{id}")
         
     | 
| 
       46 
66 
     | 
    
         
             
                    res = Http.new(uri).get
         
     | 
| 
       47 
67 
     | 
    
         
             
                    unless res.code == '200'
         
     | 
| 
       48 
68 
     | 
    
         
             
                      @log.error("#{r[:host]}:#{r[:port]} \
         
     | 
| 
         @@ -60,15 +80,22 @@ module Zold 
     | 
|
| 
       60 
80 
     | 
    
         
             
                      @log.error("#{r[:host]}:#{r[:port]} invalid score")
         
     | 
| 
       61 
81 
     | 
    
         
             
                      next
         
     | 
| 
       62 
82 
     | 
    
         
             
                    end
         
     | 
| 
      
 83 
     | 
    
         
            +
                    if score.strength < Score::STRENGTH && !opts['ignore-score-weakness']
         
     | 
| 
      
 84 
     | 
    
         
            +
                      @log.error(
         
     | 
| 
      
 85 
     | 
    
         
            +
                        "#{r[:host]}:#{r[:port]} score is too weak: #{score.strength} \
         
     | 
| 
      
 86 
     | 
    
         
            +
            (<#{Score::STRENGTH})"
         
     | 
| 
      
 87 
     | 
    
         
            +
                      )
         
     | 
| 
      
 88 
     | 
    
         
            +
                      next
         
     | 
| 
      
 89 
     | 
    
         
            +
                    end
         
     | 
| 
       63 
90 
     | 
    
         
             
                    total += 1
         
     | 
| 
       64 
     | 
    
         
            -
                     
     | 
| 
      
 91 
     | 
    
         
            +
                    cps.add(json['body'], r[:host], r[:port], score.value)
         
     | 
| 
       65 
92 
     | 
    
         
             
                    @log.info(
         
     | 
| 
       66 
93 
     | 
    
         
             
                      "#{r[:host]}:#{r[:port]} #{json['body'].length}b/\
         
     | 
| 
       67 
94 
     | 
    
         
             
            #{Rainbow(score.value).green} (v.#{json['version']})"
         
     | 
| 
       68 
95 
     | 
    
         
             
                    )
         
     | 
| 
       69 
96 
     | 
    
         
             
                  end
         
     | 
| 
       70 
97 
     | 
    
         
             
                  @log.debug("#{total} copies fetched, \
         
     | 
| 
       71 
     | 
    
         
            -
            there are #{ 
     | 
| 
      
 98 
     | 
    
         
            +
            there are #{cps.all.count} available locally")
         
     | 
| 
       72 
99 
     | 
    
         
             
                end
         
     | 
| 
       73 
100 
     | 
    
         
             
              end
         
     | 
| 
       74 
101 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,64 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Copyright (c) 2018 Yegor Bugayenko
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
      
 3 
     | 
    
         
            +
            # Permission is hereby granted, free of charge, to any person obtaining a copy
         
     | 
| 
      
 4 
     | 
    
         
            +
            # of this software and associated documentation files (the 'Software'), to deal
         
     | 
| 
      
 5 
     | 
    
         
            +
            # in the Software without restriction, including without limitation the rights
         
     | 
| 
      
 6 
     | 
    
         
            +
            # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
         
     | 
| 
      
 7 
     | 
    
         
            +
            # copies of the Software, and to permit persons to whom the Software is
         
     | 
| 
      
 8 
     | 
    
         
            +
            # furnished to do so, subject to the following conditions:
         
     | 
| 
      
 9 
     | 
    
         
            +
            #
         
     | 
| 
      
 10 
     | 
    
         
            +
            # The above copyright notice and this permission notice shall be included in all
         
     | 
| 
      
 11 
     | 
    
         
            +
            # copies or substantial portions of the Software.
         
     | 
| 
      
 12 
     | 
    
         
            +
            #
         
     | 
| 
      
 13 
     | 
    
         
            +
            # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
         
     | 
| 
      
 14 
     | 
    
         
            +
            # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
         
     | 
| 
      
 15 
     | 
    
         
            +
            # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
         
     | 
| 
      
 16 
     | 
    
         
            +
            # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
         
     | 
| 
      
 17 
     | 
    
         
            +
            # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
         
     | 
| 
      
 18 
     | 
    
         
            +
            # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
         
     | 
| 
      
 19 
     | 
    
         
            +
            # SOFTWARE.
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            require 'slop'
         
     | 
| 
      
 22 
     | 
    
         
            +
            require_relative '../log'
         
     | 
| 
      
 23 
     | 
    
         
            +
            require_relative '../prefixes'
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            # INVOICE command.
         
     | 
| 
      
 26 
     | 
    
         
            +
            # Author:: Yegor Bugayenko (yegor256@gmail.com)
         
     | 
| 
      
 27 
     | 
    
         
            +
            # Copyright:: Copyright (c) 2018 Yegor Bugayenko
         
     | 
| 
      
 28 
     | 
    
         
            +
            # License:: MIT
         
     | 
| 
      
 29 
     | 
    
         
            +
            module Zold
         
     | 
| 
      
 30 
     | 
    
         
            +
              # Generate invoice
         
     | 
| 
      
 31 
     | 
    
         
            +
              class Invoice
         
     | 
| 
      
 32 
     | 
    
         
            +
                def initialize(wallets:, log: Log::Quiet.new)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  @wallets = wallets
         
     | 
| 
      
 34 
     | 
    
         
            +
                  @log = log
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                def run(args = [])
         
     | 
| 
      
 38 
     | 
    
         
            +
                  opts = Slop.parse(args, help: true) do |o|
         
     | 
| 
      
 39 
     | 
    
         
            +
                    o.banner = "Usage: zold invoice ID [options]
         
     | 
| 
      
 40 
     | 
    
         
            +
            Where:
         
     | 
| 
      
 41 
     | 
    
         
            +
                'ID' is the wallet ID of the money receiver
         
     | 
| 
      
 42 
     | 
    
         
            +
            Available options:"
         
     | 
| 
      
 43 
     | 
    
         
            +
                    o.integer '--length',
         
     | 
| 
      
 44 
     | 
    
         
            +
                      'The length of the invoice prefix (default: 8)',
         
     | 
| 
      
 45 
     | 
    
         
            +
                      default: 8
         
     | 
| 
      
 46 
     | 
    
         
            +
                    o.bool '--help', 'Print instructions'
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
                  if opts.help?
         
     | 
| 
      
 49 
     | 
    
         
            +
                    @log.info(opts.to_s)
         
     | 
| 
      
 50 
     | 
    
         
            +
                    return
         
     | 
| 
      
 51 
     | 
    
         
            +
                  end
         
     | 
| 
      
 52 
     | 
    
         
            +
                  raise 'Receiver wallet ID is required' if opts.arguments[0].nil?
         
     | 
| 
      
 53 
     | 
    
         
            +
                  wallet = @wallets.find(Zold::Id.new(opts.arguments[0]))
         
     | 
| 
      
 54 
     | 
    
         
            +
                  raise 'Wallet doesn\'t exist, do \'fetch\' first' unless wallet.exists?
         
     | 
| 
      
 55 
     | 
    
         
            +
                  invoice(wallet, opts)
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                def invoice(wallet, opts)
         
     | 
| 
      
 59 
     | 
    
         
            +
                  invoice = "#{Prefixes.new(wallet).create(opts[:length])}@#{wallet.id}"
         
     | 
| 
      
 60 
     | 
    
         
            +
                  @log.info(invoice)
         
     | 
| 
      
 61 
     | 
    
         
            +
                  invoice
         
     | 
| 
      
 62 
     | 
    
         
            +
                end
         
     | 
| 
      
 63 
     | 
    
         
            +
              end
         
     | 
| 
      
 64 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/zold/commands/list.rb
    CHANGED
    
    
    
        data/lib/zold/commands/merge.rb
    CHANGED
    
    | 
         @@ -18,9 +18,11 @@ 
     | 
|
| 
       18 
18 
     | 
    
         
             
            # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
         
     | 
| 
       19 
19 
     | 
    
         
             
            # SOFTWARE.
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
            require_relative '../ 
     | 
| 
       23 
     | 
    
         
            -
            require_relative '../ 
     | 
| 
      
 21 
     | 
    
         
            +
            require 'slop'
         
     | 
| 
      
 22 
     | 
    
         
            +
            require_relative '../log'
         
     | 
| 
      
 23 
     | 
    
         
            +
            require_relative '../id'
         
     | 
| 
      
 24 
     | 
    
         
            +
            require_relative '../wallet'
         
     | 
| 
      
 25 
     | 
    
         
            +
            require_relative '../patch'
         
     | 
| 
       24 
26 
     | 
    
         | 
| 
       25 
27 
     | 
    
         
             
            # MERGE command.
         
     | 
| 
       26 
28 
     | 
    
         
             
            # Author:: Yegor Bugayenko (yegor256@gmail.com)
         
     | 
| 
         @@ -29,22 +31,41 @@ require_relative '../patch.rb' 
     | 
|
| 
       29 
31 
     | 
    
         
             
            module Zold
         
     | 
| 
       30 
32 
     | 
    
         
             
              # MERGE pulling command
         
     | 
| 
       31 
33 
     | 
    
         
             
              class Merge
         
     | 
| 
       32 
     | 
    
         
            -
                def initialize( 
     | 
| 
       33 
     | 
    
         
            -
                  @ 
     | 
| 
      
 34 
     | 
    
         
            +
                def initialize(wallets:, copies:, log: Log::Quiet.new)
         
     | 
| 
      
 35 
     | 
    
         
            +
                  @wallets = wallets
         
     | 
| 
       34 
36 
     | 
    
         
             
                  @copies = copies
         
     | 
| 
       35 
37 
     | 
    
         
             
                  @log = log
         
     | 
| 
       36 
38 
     | 
    
         
             
                end
         
     | 
| 
       37 
39 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
                def run( 
     | 
| 
       39 
     | 
    
         
            -
                   
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
      
 40 
     | 
    
         
            +
                def run(args = [])
         
     | 
| 
      
 41 
     | 
    
         
            +
                  opts = Slop.parse(args, help: true) do |o|
         
     | 
| 
      
 42 
     | 
    
         
            +
                    o.banner = "Usage: zold merge [ID...] [options]
         
     | 
| 
      
 43 
     | 
    
         
            +
            Available options:"
         
     | 
| 
      
 44 
     | 
    
         
            +
                    o.bool '--help', 'Print instructions'
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
      
 46 
     | 
    
         
            +
                  if opts.help?
         
     | 
| 
      
 47 
     | 
    
         
            +
                    @log.info(opts.to_s)
         
     | 
| 
      
 48 
     | 
    
         
            +
                    return
         
     | 
| 
      
 49 
     | 
    
         
            +
                  end
         
     | 
| 
      
 50 
     | 
    
         
            +
                  raise 'At least one wallet ID is required' if opts.arguments.empty?
         
     | 
| 
      
 51 
     | 
    
         
            +
                  opts.arguments.each do |id|
         
     | 
| 
      
 52 
     | 
    
         
            +
                    wallet = @wallets.find(Id.new(id))
         
     | 
| 
      
 53 
     | 
    
         
            +
                    merge(wallet, Copies.new(File.join(@copies, id)), opts)
         
     | 
| 
      
 54 
     | 
    
         
            +
                    require_relative 'propagate'
         
     | 
| 
      
 55 
     | 
    
         
            +
                    Propagate.new(wallets: @wallets, log: @log).run(args)
         
     | 
| 
      
 56 
     | 
    
         
            +
                  end
         
     | 
| 
      
 57 
     | 
    
         
            +
                end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                def merge(wallet, cps, _)
         
     | 
| 
      
 60 
     | 
    
         
            +
                  raise 'There are no remote copies, try FETCH first' if cps.all.empty?
         
     | 
| 
      
 61 
     | 
    
         
            +
                  cps = cps.all.sort_by { |c| c[:score] }.reverse
         
     | 
| 
       41 
62 
     | 
    
         
             
                  patch = Patch.new
         
     | 
| 
       42 
63 
     | 
    
         
             
                  patch.start(Wallet.new(cps[0][:path]))
         
     | 
| 
       43 
64 
     | 
    
         
             
                  cps[1..-1].each do |c|
         
     | 
| 
       44 
65 
     | 
    
         
             
                    patch.join(Wallet.new(c[:path]))
         
     | 
| 
       45 
66 
     | 
    
         
             
                  end
         
     | 
| 
       46 
     | 
    
         
            -
                  patch.save( 
     | 
| 
       47 
     | 
    
         
            -
                  @log.debug("Merged successfully into #{ 
     | 
| 
      
 67 
     | 
    
         
            +
                  patch.save(wallet.path, overwrite: true)
         
     | 
| 
      
 68 
     | 
    
         
            +
                  @log.debug("Merged successfully into #{wallet.path}")
         
     | 
| 
       48 
69 
     | 
    
         
             
                end
         
     | 
| 
       49 
70 
     | 
    
         
             
              end
         
     | 
| 
       50 
71 
     | 
    
         
             
            end
         
     | 
    
        data/lib/zold/commands/node.rb
    CHANGED
    
    | 
         @@ -47,8 +47,8 @@ module Zold 
     | 
|
| 
       47 
47 
     | 
    
         
             
                    o.string '--home', 'Home directory (default: current directory)',
         
     | 
| 
       48 
48 
     | 
    
         
             
                      default: Dir.pwd
         
     | 
| 
       49 
49 
     | 
    
         
             
                    o.integer '--strength',
         
     | 
| 
       50 
     | 
    
         
            -
                      "The strength of the score (default: #{Score:: 
     | 
| 
       51 
     | 
    
         
            -
                      default: Score:: 
     | 
| 
      
 50 
     | 
    
         
            +
                      "The strength of the score (default: #{Score::STRENGTH})",
         
     | 
| 
      
 51 
     | 
    
         
            +
                      default: Score::STRENGTH
         
     | 
| 
       52 
52 
     | 
    
         
             
                    o.integer '--threads',
         
     | 
| 
       53 
53 
     | 
    
         
             
                      'How many threads to use for scores finding (default: 8)',
         
     | 
| 
       54 
54 
     | 
    
         
             
                      default: 8
         
     | 
| 
         @@ -96,6 +96,10 @@ module Zold 
     | 
|
| 
       96 
96 
     | 
    
         
             
                  def debug(msg)
         
     | 
| 
       97 
97 
     | 
    
         
             
                    @log.debug(msg)
         
     | 
| 
       98 
98 
     | 
    
         
             
                  end
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                  def debug?
         
     | 
| 
      
 101 
     | 
    
         
            +
                    @log.debug?
         
     | 
| 
      
 102 
     | 
    
         
            +
                  end
         
     | 
| 
       99 
103 
     | 
    
         
             
                end
         
     | 
| 
       100 
104 
     | 
    
         
             
              end
         
     | 
| 
       101 
105 
     | 
    
         
             
            end
         
     |