ledger-lite 0.0.1 → 1.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc54a08adc58f1f0a7c50cb0ce42439ed2dd5312
4
- data.tar.gz: '05199c14456c983c82d94981f098075ea49d743b'
3
+ metadata.gz: 27bbb8efe382ef8c1c4fa635037363e667ec46c9
4
+ data.tar.gz: 13f8ddac47b8b2f8b44074fe8d3b0a6da256e32e
5
5
  SHA512:
6
- metadata.gz: e52f287dbe9e9aff4cfe896f728a19c060e730bc86db485e1ff555ac6df3239d1b032f48684adf91b8810f97e50f57cc3ae60055d0398d588ca9339a5faddfa8
7
- data.tar.gz: a4fbb0a4344cdd8dfe161c5ec855e9e49943d4414c29b58da4cf829ffb09664b10a95b313faf45c697e9b05657c3c780f09434c99aaa4849c7a1064253759fc2
6
+ metadata.gz: 9fafcfdd2f34532ec5885e6db2c35bb594e19027bfdc55fca920dfb69c7231e795ca1b29e7e3c135e703d3745c9274997196291895055b696673fd8cb8e94363
7
+ data.tar.gz: cc347bb5d02ba4cb6ca76aa348bcdbcc59ff8abf3f413268c3705599395607b69783f2d5c1d216758a9fafb308573d4e7985c8f23ae0b6d4846717da9329f703
data/Manifest.txt CHANGED
@@ -6,4 +6,6 @@ Rakefile
6
6
  lib/ledger-lite.rb
7
7
  lib/ledger-lite/version.rb
8
8
  test/helper.rb
9
- test/test_transfer.rb
9
+ test/test_blocks.rb
10
+ test/test_transactions.rb
11
+ test/test_version.rb
data/README.md CHANGED
@@ -9,6 +9,203 @@ ledger-lite library / gem - hyper ledger book for the distributed blockchain int
9
9
  * rdoc :: [rubydoc.info/gems/ledger-lite](http://rubydoc.info/gems/ledger-lite)
10
10
 
11
11
 
12
+ ## Usage
13
+
14
+ Let's add some transactions to the (hyper) ledger book:
15
+
16
+ | From | To | $ |
17
+ |---------------------|--------------|----:|
18
+ | Keukenhof (†) | Vincent | 11 |
19
+ | Vincent | Anne | 3 |
20
+ | Anne | Julia | 2 |
21
+ | Julia | Luuk | 1 |
22
+ | | | |
23
+ | Dutchgrown (†) | Ruben | 11 |
24
+ | Vincent | Max | 3 |
25
+ | Ruben | Julia | 2 |
26
+ | Anne | Martijn | 1 |
27
+
28
+ (†): Mining Transaction - New Dutch Gulden ($) on the Market!
29
+
30
+
31
+
32
+ ### Use `send` (send payment/transfer money)
33
+
34
+ ```ruby
35
+
36
+ ledger = Ledger.new
37
+
38
+ ledger.send( "Keukenhof†", "Vincent", 11 )
39
+ ledger.send( "Vincent", "Anne", 3 )
40
+ ledger.send( "Anne", "Julia", 2 )
41
+ ledger.send( "Julia", "Luuk", 1 )
42
+
43
+ ledger.send( "Dutchgrown†", "Ruben", 11 )
44
+ ledger.send( "Vincent", "Max", 3 )
45
+ ledger.send( "Ruben", "Julia", 2 )
46
+ ledger.send( "Anne", "Martijn", 1 )
47
+
48
+ pp ledger ## pp = pretty print
49
+
50
+ ```
51
+
52
+ resulting in
53
+
54
+ ```
55
+ #<LedgerLite::Ledger
56
+ @addr={
57
+ "Vincent" => 5,
58
+ "Anne" => 0,
59
+ "Julia" => 3,
60
+ "Luuk" => 1,
61
+ "Ruben" => 9,
62
+ "Max" => 3,
63
+ "Martijn" => 1}>
64
+ ```
65
+
66
+ that is, the addr hash holds all addresses (addr) with the account balances
67
+ telling you who owns how much:
68
+
69
+ | Addr(ess) | Balance $ |
70
+ |---------------------|----------:|
71
+ | Vincent | 5 |
72
+ | Anne | 0 |
73
+ | Julia | 3 |
74
+ | Luuk | 1 |
75
+ | Ruben | 9 |
76
+ | Max | 3 |
77
+ | Martijn | 1 |
78
+
79
+
80
+ ### Use `write` to write / add transactions
81
+
82
+ Or use transaction (tx) classes/structs:
83
+
84
+ ``` ruby
85
+ ledger = Ledger.new
86
+
87
+ ledger.write( Tx.new( "Keukenhof†", "Vincent", 11 ))
88
+ ledger.write( Tx.new( "Vincent", "Anne", 3 ))
89
+ ledger.write( Tx.new( "Anne", "Julia", 2 ))
90
+ ledger.write( Tx.new( "Julia", "Luuk", 1 ))
91
+
92
+ ledger.write( Tx.new( "Dutchgrown†", "Ruben", 11 ))
93
+ ledger.write( Tx.new( "Vincent", "Max", 3 ))
94
+ ledger.write( Tx.new( "Ruben", "Julia", 2 ))
95
+ ledger.write( Tx.new( "Anne", "Martijn", 1 ))
96
+
97
+ pp ledger
98
+ ```
99
+
100
+
101
+ Or pass in many transaction (Tx) classes/structs:
102
+
103
+ ``` ruby
104
+ ledger = Ledger.new
105
+
106
+ ledger.write( Tx.new( "Keukenhof†", "Vincent", 11 ),
107
+ Tx.new( "Vincent", "Anne", 3 ),
108
+ Tx.new( "Anne", "Julia", 2 ),
109
+ Tx.new( "Julia", "Luuk", 1 ))
110
+
111
+ ledger.write( Tx.new( "Dutchgrown†", "Ruben", 11 ),
112
+ Tx.new( "Vincent", "Max", 3 ),
113
+ Tx.new( "Ruben", "Julia", 2 ),
114
+ Tx.new( "Anne", "Martijn", 1 ))
115
+
116
+ pp ledger
117
+ ```
118
+
119
+ Or use the operator `<<` alias for `write`:
120
+
121
+ ```ruby
122
+ ledger = Ledger.new
123
+
124
+ ledger << Tx.new( "Keukenhof†", "Vincent", 11 )
125
+ ledger << Tx.new( "Vincent", "Anne", 3 )
126
+ ledger << Tx.new( "Anne", "Julia", 2 )
127
+ ledger << Tx.new( "Julia", "Luuk", 1 )
128
+
129
+ ledger << [Tx.new( "Dutchgrown†", "Ruben", 11 ),
130
+ Tx.new( "Vincent", "Max", 3 ),
131
+ Tx.new( "Ruben", "Julia", 2 ),
132
+ Tx.new( "Anne", "Martijn", 1 )]
133
+
134
+ pp ledger
135
+ ```
136
+
137
+ Or use transaction hashes:
138
+
139
+ ``` ruby
140
+ ledger = Ledger.new
141
+
142
+ ledger.write( { from: "Keukenhof†", to: "Vincent", amount: 11 },
143
+ { from: "Vincent", to: "Anne", amount: 3 },
144
+ { from: "Anne", to: "Julia", amount: 2 },
145
+ { from: "Julia", to: "Luuk", amount: 1 })
146
+
147
+ ledger.write( { from: "Dutchgrown†", to: "Ruben", amount: 11 },
148
+ { from: "Vincent", to: "Max", amount: 3 },
149
+ { from: "Ruben", to: "Julia", amount: 2 },
150
+ { from: "Anne", to: "Martijn", amount: 1 })
151
+
152
+ pp ledger
153
+ ```
154
+
155
+
156
+ Or use blocks of transaction hashes:
157
+
158
+ ``` ruby
159
+
160
+ ledger = Ledger.new
161
+
162
+ ledger.write( Block.new( { from: "Keukenhof†", to: "Vincent", amount: 11 },
163
+ { from: "Vincent", to: "Anne", amount: 3 },
164
+ { from: "Anne", to: "Julia", amount: 2 },
165
+ { from: "Julia", to: "Luuk", amount: 1 } ),
166
+ Block.new( { from: "Dutchgrown†", to: "Ruben", amount: 11 },
167
+ { from: "Vincent", to: "Max", amount: 3 },
168
+ { from: "Ruben", to: "Julia", amount: 2 },
169
+ { from: "Anne", to: "Martijn", amount: 1 } ))
170
+
171
+ pp ledger
172
+ ```
173
+
174
+
175
+ Or use blocks of transaction classes/structs:
176
+
177
+ ``` ruby
178
+ ledger = Ledger.new
179
+
180
+ ledger.write( Block.new( Tx.new( "Keukenhof†", "Vincent", 11 ),
181
+ Tx.new( "Vincent", "Anne", 3 ),
182
+ Tx.new( "Anne", "Julia", 2 ),
183
+ Tx.new( "Julia", "Luuk", 1 )),
184
+ Block.new( Tx.new( "Dutchgrown†", "Ruben", 11 ),
185
+ Tx.new( "Vincent", "Max", 3 ),
186
+ Tx.new( "Ruben", "Julia", 2 ),
187
+ Tx.new( "Anne", "Martijn", 1 )))
188
+
189
+ pp ledger
190
+ ```
191
+
192
+ Or use blocks of transaction classes/structs (with keyword arguments):
193
+
194
+ ```ruby
195
+ ledger = Ledger.new
196
+
197
+ ledger.write( Block.new( Tx.new( from: "Keukenhof†", to: "Vincent", amount: 11 ),
198
+ Tx.new( from: "Vincent", to: "Anne", amount: 3 ),
199
+ Tx.new( from: "Anne", to: "Julia", amount: 2 ),
200
+ Tx.new( from: "Julia", to: "Luuk", amount: 1 )),
201
+ Block.new( Tx.new( from: "Dutchgrown†", to: "Ruben", amount: 11 ),
202
+ Tx.new( from: "Vincent", to: "Max", amount: 3 ),
203
+ Tx.new( from: "Ruben", to: "Julia", amount: 2 ),
204
+ Tx.new( from: "Anne", to: "Martijn", amount: 1 )))
205
+
206
+ pp ledger
207
+ ```
208
+
12
209
 
13
210
 
14
211
  ## License
data/lib/ledger-lite.rb CHANGED
@@ -1,13 +1,14 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'pp' # for pp => pretty printer
4
-
3
+ require 'pp' # for pp => pretty printer
4
+ require 'forwardable'
5
5
  require 'date'
6
6
  require 'time'
7
7
  require 'json'
8
8
 
9
9
 
10
10
 
11
+
11
12
  ## our own code
12
13
  require 'ledger-lite/version' # note: let version always go first
13
14
 
@@ -15,52 +16,114 @@ require 'ledger-lite/version' # note: let version always go first
15
16
 
16
17
  module LedgerLite
17
18
 
19
+
20
+
21
+ class Configuration
22
+
23
+ ## system settings
24
+
25
+ ## use a different name e.g.
26
+ ## - mint (like royal mint or federal coin mint?) or
27
+ ## - base
28
+ ## - magic (for creating coins out-of-nothing?) or
29
+ ## - network or ??) - why? why not?
30
+ ##
31
+ attr_accessor :coinbase
32
+
33
+ ## note: for now is an array (allow/ support multiple coinbases)
34
+ ## note: add a (†) coinbase marker
35
+ COINBASE = ['Coinbase†']
36
+
37
+ def initialize
38
+ @coinbase = COINBASE
39
+ end
40
+
41
+ def coinbase?( addr )
42
+ @coinbase.include?( addr )
43
+ end
44
+ end # class Configuration
45
+
46
+
47
+
48
+
18
49
  class Ledger
50
+ extend Forwardable
51
+
52
+
53
+ ## lets you use
54
+ ## Ledger.configure do |config|
55
+ ## config.coinbase = ['Keukenhof†']
56
+ ## end
57
+
58
+ def self.configure
59
+ yield( config )
60
+ end
61
+
62
+ def self.config
63
+ @config ||= Configuration.new
64
+ end
65
+
66
+
19
67
 
20
68
  attr_reader :addr ## make addr private e.g. remove - why? e.g. use hash forwards/delegates - why not?
21
69
 
22
- def initialize( args=[] )
23
- ## todo/fix: use *args - same interface as merkletree/blochchain-lite
24
70
 
71
+ ## delegate some methods (and operators) to addr hash (for easier/shortcut access)
72
+ def_delegators :@addr, :[], :size, :each, :empty?, :any?
73
+
74
+
75
+ def initialize( *args )
25
76
  @addr = {}
26
77
 
27
- args.each do |arg|
28
- if arg.respond_to?( :transactions ) ## bingo! assume it's block if it has transactions method
29
- transfer( arg.transactions )
30
- else
31
- transfer( arg )
32
- end
33
- end
78
+ ## add all transactions passed in on startup; if no args - do nothing
79
+ unless args.empty?
80
+ ## note: MUST unsplat (*) args
81
+ ## otherwise args get "double" wrapped in array
82
+ write( *args )
83
+ end
34
84
  end # method initialize
35
85
 
36
86
 
37
87
 
38
- ##
39
- # find a better name - why? why not?
40
- ## e.g. use can? funds? sufficient? has_funds?
41
- def sufficient_funds?( addr, amount )
42
- ## fix:
43
- true
88
+ def write( *args )
89
+ puts "write:"
90
+ pp args
91
+
92
+ ## note: allow/support splat-* for now for convenience (auto-wraps args into array)
93
+ if args.size == 1 && args[0].is_a?( Array )
94
+ puts " unwrap array in array"
95
+ blks_or_txns = args[0] ## "unwrap" array in array
96
+ else
97
+ blks_or_txns = args ## use "auto-wrapped" splat array
98
+ end
99
+
100
+ ## "unpack" transactions from possible (optional) blocks
101
+ ## and return "flattend" **single** array of transactions
102
+ transactions = unpack_transactions( blks_or_txns )
103
+
104
+ ## unpack & unsplat array (to pass in args to send) => from, to, amount
105
+ transactions.each { |tx| send( *unpack(tx) ) }
44
106
  end
45
107
 
108
+ ## note: add and the << operator is an alias for write
109
+ alias :add :write
110
+ alias :<< :write
46
111
 
47
- def transfer( arg )
48
- ## todo/fix: use *args - same interface as merkletree/blochchain-lite
49
112
 
50
- puts "transfer:"
51
- pp arg
113
+ def unpack_transactions( blocks )
114
+ ## "unpack" transactions from possible (optional) blocks
115
+ ## and return "flattend" **single** array of transactions
52
116
 
53
- if arg.is_a?( Array )
54
- txs = arg
55
- txs.each { |tx| do_transfer( *unpack(tx) ) } ## unpack & unsplat array (to pass in args) => from, to, amount
56
- else
57
- ## assume single tx
58
- tx = arg
59
- do_transfer( *unpack(tx) ) ## unpack & unsplat array (to pass in args) => from, to, amount
117
+ blocks.reduce( [] ) do |acc, block|
118
+ if block.respond_to?( :transactions ) ## bingo! assume it's block if it has transactions method
119
+ acc + block.transactions
120
+ else ## note: otherwise assumes it's just a "plain" **single** transaction
121
+ tx = block
122
+ acc + [tx] ## wrap in array (use acc << tx - with side effects/mutate in place - why? why not?)
123
+ end
60
124
  end
61
125
  end
62
126
 
63
-
64
127
  def unpack( tx )
65
128
  ## "unpack" from, to, amount values
66
129
 
@@ -80,22 +143,38 @@ class Ledger
80
143
  end
81
144
 
82
145
 
83
- ## apply/do single transaction
146
+ ##
147
+ # find a better name - why? why not?
148
+ ## e.g. use can? funds? sufficient? has_funds?
149
+ def sufficient_funds?( addr, amount )
150
+ return true if self.class.config.coinbase?( addr ) ## note: coinbase has unlimited funds!!!
151
+ @addr.has_key?( addr ) && @addr[addr] - amount >= 0
152
+ end
153
+
154
+
155
+ ## apply/do single transaction - send payment - do transfer
84
156
  ## - find a different name - why? why not?
85
- def do_transfer( from, to, amount )
157
+ def send( from, to, amount )
86
158
 
87
159
  if sufficient_funds?( from, amount )
88
- @addr[ from ] ||= 0
89
- @addr[ from ] -= amount
160
+ if self.class.config.coinbase?( from )
161
+ # note: coinbase has unlimited funds!! ("virtual" built-in money printing address)
162
+ else
163
+ @addr[ from ] ||= 0
164
+ @addr[ from ] -= amount
165
+ end
90
166
  @addr[ to ] ||= 0
91
167
  @addr[ to ] += amount
92
168
  end
169
+ end # method transfer
93
170
 
94
- end # do_transfer
171
+ ## note: transfer is an alias for send (payment)
172
+ alias :transfer :send
95
173
 
96
174
 
97
175
  end # class Ledger
98
176
 
177
+
99
178
  end # module LedgerLite
100
179
 
101
180
 
@@ -3,9 +3,9 @@
3
3
 
4
4
  module LedgerLite
5
5
 
6
- MAJOR = 0
6
+ MAJOR = 1
7
7
  MINOR = 0
8
- PATCH = 1
8
+ PATCH = 0
9
9
  VERSION = [MAJOR,MINOR,PATCH].join('.')
10
10
 
11
11
  def self.version
@@ -0,0 +1,107 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_blocks.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+
11
+ class TestBlocks < MiniTest::Test
12
+
13
+ def setup
14
+ Ledger.configure do |config|
15
+ config.coinbase = ["Keukenhof†", "Dutchgrown†"]
16
+ end
17
+ end
18
+
19
+ def test_blocks_with_hash
20
+
21
+ b0 = Block.new( { from: "Keukenhof†", to: "Vincent", amount: 11 },
22
+ { from: "Vincent", to: "Anne", amount: 3 },
23
+ { from: "Anne", to: "Julia", amount: 2 },
24
+ { from: "Julia", to: "Luuk", amount: 1 } )
25
+
26
+ b1 = Block.new( { from: "Dutchgrown†", to: "Ruben", amount: 11 },
27
+ { from: "Vincent", to: "Max", amount: 3 },
28
+ { from: "Ruben", to: "Julia", amount: 2 },
29
+ { from: "Anne", to: "Martijn", amount: 1 } )
30
+
31
+ blockchain = [b0,b1]
32
+
33
+ ledger = Ledger.new( blockchain )
34
+
35
+ pp ledger
36
+
37
+ balances = {"Vincent"=>5,
38
+ "Anne"=>0,
39
+ "Julia"=>3,
40
+ "Luuk"=>1,
41
+ "Ruben"=>9,
42
+ "Max"=>3,
43
+ "Martijn"=>1}
44
+ assert_equal balances, ledger.addr
45
+ end
46
+
47
+
48
+ def test_blocks_with_tx_v1
49
+
50
+ b0 = Block.new( Tx.new( from: "Keukenhof†", to: "Vincent", amount: 11 ),
51
+ Tx.new( from: "Vincent", to: "Anne", amount: 3 ),
52
+ Tx.new( from: "Anne", to: "Julia", amount: 2 ),
53
+ Tx.new( from: "Julia", to: "Luuk", amount: 1 ))
54
+
55
+ b1 = Block.new( Tx.new( from: "Dutchgrown†", to: "Ruben", amount: 11 ),
56
+ Tx.new( from: "Vincent", to: "Max", amount: 3 ),
57
+ Tx.new( from: "Ruben", to: "Julia", amount: 2 ),
58
+ Tx.new( from: "Anne", to: "Martijn", amount: 1 ))
59
+
60
+ blockchain = [b0,b1]
61
+
62
+ ledger = Ledger.new( blockchain )
63
+
64
+ pp ledger
65
+
66
+ balances = {"Vincent"=>5,
67
+ "Anne"=>0,
68
+ "Julia"=>3,
69
+ "Luuk"=>1,
70
+ "Ruben"=>9,
71
+ "Max"=>3,
72
+ "Martijn"=>1}
73
+ assert_equal balances, ledger.addr
74
+ end
75
+
76
+
77
+
78
+ def test_blocks_with_tx_v2
79
+
80
+ b0 = Block.new( Tx.new( "Keukenhof†", "Vincent", 11 ),
81
+ Tx.new( "Vincent", "Anne", 3 ),
82
+ Tx.new( "Anne", "Julia", 2 ),
83
+ Tx.new( "Julia", "Luuk", 1 ))
84
+
85
+ b1 = Block.new( Tx.new( "Dutchgrown†", "Ruben", 11 ),
86
+ Tx.new( "Vincent", "Max", 3 ),
87
+ Tx.new( "Ruben", "Julia", 2 ),
88
+ Tx.new( "Anne", "Martijn", 1 ))
89
+
90
+ blockchain = [b0,b1]
91
+
92
+ ledger = Ledger.new( blockchain )
93
+
94
+ pp ledger
95
+
96
+ balances = {"Vincent"=>5,
97
+ "Anne"=>0,
98
+ "Julia"=>3,
99
+ "Luuk"=>1,
100
+ "Ruben"=>9,
101
+ "Max"=>3,
102
+ "Martijn"=>1}
103
+ assert_equal balances, ledger.addr
104
+ end
105
+
106
+
107
+ end # class TestBlocks
@@ -0,0 +1,156 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_transactions.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+
11
+ class TestTransactions < MiniTest::Test
12
+
13
+ def setup
14
+ Ledger.configure do |config|
15
+ config.coinbase = ["Keukenhof†", "Dutchgrown†"]
16
+ end
17
+ end
18
+
19
+
20
+ def test_send
21
+
22
+ ledger = Ledger.new
23
+
24
+ ledger.send( "Keukenhof†", "Vincent", 11 )
25
+ ledger.send( "Vincent", "Anne", 3 )
26
+ ledger.send( "Anne", "Julia", 2 )
27
+ ledger.send( "Julia", "Luuk", 1 )
28
+
29
+ ledger.send( "Dutchgrown†", "Ruben", 11 )
30
+ ledger.send( "Vincent", "Max", 3 )
31
+ ledger.send( "Ruben", "Julia", 2 )
32
+ ledger.send( "Anne", "Martijn", 1 )
33
+
34
+ pp ledger
35
+
36
+ balances = {"Vincent"=>5,
37
+ "Anne"=>0,
38
+ "Julia"=>3,
39
+ "Luuk"=>1,
40
+ "Ruben"=>9,
41
+ "Max"=>3,
42
+ "Martijn"=>1}
43
+ assert_equal balances, ledger.addr
44
+ end
45
+
46
+
47
+ def test_with_tx_v1
48
+
49
+ ledger = Ledger.new
50
+
51
+ ledger.write( Tx.new( "Keukenhof†", "Vincent", 11 ))
52
+ ledger.write( Tx.new( "Vincent", "Anne", 3 ))
53
+ ledger.write( Tx.new( "Anne", "Julia", 2 ))
54
+ ledger.write( Tx.new( "Julia", "Luuk", 1 ))
55
+
56
+ ledger.write( Tx.new( "Dutchgrown†", "Ruben", 11 ))
57
+ ledger.write( Tx.new( "Vincent", "Max", 3 ))
58
+ ledger.write( Tx.new( "Ruben", "Julia", 2 ))
59
+ ledger.write( Tx.new( "Anne", "Martijn", 1 ))
60
+
61
+ pp ledger
62
+
63
+ balances = {"Vincent"=>5,
64
+ "Anne"=>0,
65
+ "Julia"=>3,
66
+ "Luuk"=>1,
67
+ "Ruben"=>9,
68
+ "Max"=>3,
69
+ "Martijn"=>1}
70
+ assert_equal balances, ledger.addr
71
+ end
72
+
73
+
74
+ def test_with_tx_v2
75
+
76
+ ledger = Ledger.new
77
+
78
+ ledger.write( Tx.new( "Keukenhof†", "Vincent", 11 ),
79
+ Tx.new( "Vincent", "Anne", 3 ),
80
+ Tx.new( "Anne", "Julia", 2 ),
81
+ Tx.new( "Julia", "Luuk", 1 ))
82
+
83
+ ledger.write( Tx.new( "Dutchgrown†", "Ruben", 11 ),
84
+ Tx.new( "Vincent", "Max", 3 ),
85
+ Tx.new( "Ruben", "Julia", 2 ),
86
+ Tx.new( "Anne", "Martijn", 1 ))
87
+
88
+ pp ledger
89
+
90
+ balances = {"Vincent"=>5,
91
+ "Anne"=>0,
92
+ "Julia"=>3,
93
+ "Luuk"=>1,
94
+ "Ruben"=>9,
95
+ "Max"=>3,
96
+ "Martijn"=>1}
97
+ assert_equal balances, ledger.addr
98
+ end
99
+
100
+
101
+ def test_with_tx_v3
102
+
103
+ ledger = Ledger.new
104
+
105
+ ledger << Tx.new( "Keukenhof†", "Vincent", 11 )
106
+ ledger << Tx.new( "Vincent", "Anne", 3 )
107
+ ledger << Tx.new( "Anne", "Julia", 2 )
108
+ ledger << Tx.new( "Julia", "Luuk", 1 )
109
+
110
+ ledger << [Tx.new( "Dutchgrown†", "Ruben", 11 ),
111
+ Tx.new( "Vincent", "Max", 3 ),
112
+ Tx.new( "Ruben", "Julia", 2 ),
113
+ Tx.new( "Anne", "Martijn", 1 )]
114
+
115
+ pp ledger
116
+
117
+ balances = {"Vincent"=>5,
118
+ "Anne"=>0,
119
+ "Julia"=>3,
120
+ "Luuk"=>1,
121
+ "Ruben"=>9,
122
+ "Max"=>3,
123
+ "Martijn"=>1}
124
+ assert_equal balances, ledger.addr
125
+ end
126
+
127
+
128
+
129
+ def test_with_hash
130
+
131
+ ledger = Ledger.new
132
+
133
+ ledger.write( { from: "Keukenhof†", to: "Vincent", amount: 11 },
134
+ { from: "Vincent", to: "Anne", amount: 3 },
135
+ { from: "Anne", to: "Julia", amount: 2 },
136
+ { from: "Julia", to: "Luuk", amount: 1 })
137
+
138
+ ledger.write( { from: "Dutchgrown†", to: "Ruben", amount: 11 },
139
+ { from: "Vincent", to: "Max", amount: 3 },
140
+ { from: "Ruben", to: "Julia", amount: 2 },
141
+ { from: "Anne", to: "Martijn", amount: 1 })
142
+
143
+ pp ledger
144
+
145
+ balances = {"Vincent"=>5,
146
+ "Anne"=>0,
147
+ "Julia"=>3,
148
+ "Luuk"=>1,
149
+ "Ruben"=>9,
150
+ "Max"=>3,
151
+ "Martijn"=>1}
152
+ assert_equal balances, ledger.addr
153
+ end
154
+
155
+
156
+ end # class TestTransactions
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_version.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+
11
+ class TestVersion < MiniTest::Test
12
+
13
+ def test_version
14
+ pp LedgerLite.version
15
+ pp LedgerLite.banner
16
+ pp LedgerLite.root
17
+
18
+ assert true ## (for now) everything ok if we get here
19
+ end
20
+
21
+
22
+ end # class TestVersion
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ledger-lite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-04 00:00:00.000000000 Z
11
+ date: 2018-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdoc
@@ -58,7 +58,9 @@ files:
58
58
  - lib/ledger-lite.rb
59
59
  - lib/ledger-lite/version.rb
60
60
  - test/helper.rb
61
- - test/test_transfer.rb
61
+ - test/test_blocks.rb
62
+ - test/test_transactions.rb
63
+ - test/test_version.rb
62
64
  homepage: https://github.com/openblockchains/ledger.lite.rb
63
65
  licenses:
64
66
  - Public Domain
@@ -1,118 +0,0 @@
1
- # encoding: utf-8
2
-
3
- ###
4
- # to run use
5
- # ruby -I ./lib -I ./test test/test_transfer.rb
6
-
7
-
8
- require 'helper'
9
-
10
-
11
- class TestTransfer < MiniTest::Test
12
-
13
-
14
- def test_do_transfer
15
-
16
- ledger = Ledger.new
17
-
18
- ledger.do_transfer( "Vicent", "Anne", 3 )
19
- ledger.do_transfer( "Anne", "Julia", 2 )
20
- ledger.do_transfer( "Julia", "Luuk", 1 )
21
-
22
- ledger.do_transfer( "Vincent", "Max", 3 )
23
- ledger.do_transfer( "Anne", "Martijn", 2 )
24
- ledger.do_transfer( "Ruben", "Julia", 1 )
25
-
26
- pp ledger
27
-
28
- balances = {"Vicent"=>-3,
29
- "Anne"=>-1,
30
- "Julia"=>2,
31
- "Luuk"=>1,
32
- "Vincent"=>-3,
33
- "Max"=>3,
34
- "Martijn"=>2,
35
- "Ruben"=>-1}
36
- assert_equal balances, ledger.addr
37
- end
38
-
39
-
40
- def test_transfer_with_tx_v1
41
-
42
- ledger = Ledger.new
43
-
44
- ledger.transfer( Tx.new( "Vicent", "Anne", 3 ))
45
- ledger.transfer( Tx.new( "Anne", "Julia", 2 ))
46
- ledger.transfer( Tx.new( "Julia", "Luuk", 1 ))
47
-
48
- ledger.transfer( Tx.new( "Vincent", "Max", 3 ))
49
- ledger.transfer( Tx.new( "Anne", "Martijn", 2 ))
50
- ledger.transfer( Tx.new( "Ruben", "Julia", 1 ))
51
-
52
- pp ledger
53
-
54
- balances = {"Vicent"=>-3,
55
- "Anne"=>-1,
56
- "Julia"=>2,
57
- "Luuk"=>1,
58
- "Vincent"=>-3,
59
- "Max"=>3,
60
- "Martijn"=>2,
61
- "Ruben"=>-1}
62
- assert_equal balances, ledger.addr
63
- end
64
-
65
-
66
- def test_transfer_with_tx_v2
67
-
68
- ledger = Ledger.new
69
-
70
- ledger.transfer( [Tx.new( "Vicent", "Anne", 3 ),
71
- Tx.new( "Anne", "Julia", 2 ),
72
- Tx.new( "Julia", "Luuk", 1 )])
73
-
74
- ledger.transfer( [Tx.new( "Vincent", "Max", 3 ),
75
- Tx.new( "Anne", "Martijn", 2 ),
76
- Tx.new( "Ruben", "Julia", 1 )])
77
-
78
- pp ledger
79
-
80
- balances = {"Vicent"=>-3,
81
- "Anne"=>-1,
82
- "Julia"=>2,
83
- "Luuk"=>1,
84
- "Vincent"=>-3,
85
- "Max"=>3,
86
- "Martijn"=>2,
87
- "Ruben"=>-1}
88
- assert_equal balances, ledger.addr
89
- end
90
-
91
-
92
- def test_transfer_with_hash
93
-
94
- ledger = Ledger.new
95
-
96
- ledger.transfer( [{ from: "Vicent", to: "Anne", amount: 3 },
97
- { from: "Anne", to: "Julia", amount: 2 },
98
- { from: "Julia", to: "Luuk", amount: 1 }])
99
-
100
- ledger.transfer( [{ from: "Vincent", to: "Max", amount: 3 },
101
- { from: "Anne", to: "Martijn", amount: 2 },
102
- { from: "Ruben", to: "Julia", amount: 1 }])
103
-
104
- pp ledger
105
-
106
- balances = {"Vicent"=>-3,
107
- "Anne"=>-1,
108
- "Julia"=>2,
109
- "Luuk"=>1,
110
- "Vincent"=>-3,
111
- "Max"=>3,
112
- "Martijn"=>2,
113
- "Ruben"=>-1}
114
- assert_equal balances, ledger.addr
115
- end
116
-
117
-
118
- end # class TestTransfer