michelson 0.1.0 → 0.1.1
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/Manifest.txt +3 -0
- data/README.md +3 -2
- data/lib/michelson/michelson.rb +164 -0
- data/lib/michelson/version.rb +1 -1
- data/test/helper.rb +8 -0
- data/test/test_counter.rb +42 -0
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c38fcb8b1914f1dd67e97fcbefa894c09988d19b
|
4
|
+
data.tar.gz: aaefda11aab976e8683faee197f783c53c7da8f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1f77fc464cf095c83896265a4071566a50e3fd3ec0b60535d965ed0d62c4fb3e16aa84426e1db505cd275f44ee8fc209f0252383960da503edf184403b5a074
|
7
|
+
data.tar.gz: a979354201a30ad6e5c2bcf46675883d39e9c3e0457a1929a5a875aa3513fd1e79111734adec5a108342b09c68f13dc9ea0606d0007bc478c31bedbd25349831
|
data/Manifest.txt
CHANGED
data/README.md
CHANGED
@@ -14,8 +14,9 @@ michelson gem / library - test simulator / runtime for type-safe 'n' functional
|
|
14
14
|
|
15
15
|
**What's Michelson? What's Liquidity?**
|
16
16
|
|
17
|
-
The Liquidity language lets you
|
18
|
-
compiling to (lower-level) Michelson stack machine bytecode
|
17
|
+
The [Liquidity language](http://www.liquidity-lang.org) lets you programm (crypto) contracts with (higher-level type-safe functional) OCaml or ReasonML syntax
|
18
|
+
compiling to (lower-level) [Michelson stack machine bytecode](https://www.michelson-lang.com).
|
19
|
+
|
19
20
|
|
20
21
|
Using the michelson test simulator / runtime for type-safe 'n' functional (crypto) contracts you can now use a "Yes, It's Just Ruby" syntax.
|
21
22
|
|
@@ -0,0 +1,164 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
def type( class_name, *args )
|
6
|
+
puts "define type #{class_name}:"
|
7
|
+
pp args
|
8
|
+
|
9
|
+
if args.size == 1 && args[0].is_a?( Class )
|
10
|
+
klass = args[0]
|
11
|
+
Kernel.const_set( class_name, klass )
|
12
|
+
elsif args.size == 1 && args[0].is_a?( Hash )
|
13
|
+
keys = args[0].keys
|
14
|
+
klass = Struct.new( *keys )
|
15
|
+
Kernel.const_set( class_name, klass )
|
16
|
+
else
|
17
|
+
raise ArgumentError.new( "Class or Hash expected")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def define_function( method, signature )
|
23
|
+
## todo/fix: check if we are in a module ?
|
24
|
+
## only use Object.__send__ as a (last) fallback (for convenience) - why? why not?
|
25
|
+
Object.__send__( :alias_method, "#{method}_unsafe", method )
|
26
|
+
|
27
|
+
puts "define function #{method}:"
|
28
|
+
pp signature
|
29
|
+
|
30
|
+
define_method method do |*args|
|
31
|
+
if args.size == 0
|
32
|
+
call_inspect = "#{method}()"
|
33
|
+
else
|
34
|
+
args_inspect = args.map { |arg| arg.inspect }.join( ", " )
|
35
|
+
call_inspect = "#{method}( #{args_inspect} )"
|
36
|
+
end
|
37
|
+
puts "calling #{call_inspect}..."
|
38
|
+
|
39
|
+
__send__( "#{method}_unsafe", *args ).tap do |result|
|
40
|
+
puts "returning:"
|
41
|
+
pp result
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def sig( *args )
|
48
|
+
method = args.pop # remove last element (assume it's a method)
|
49
|
+
signature = args
|
50
|
+
define_function( method, signature )
|
51
|
+
end
|
52
|
+
|
53
|
+
def init( *args )
|
54
|
+
sig( *args )
|
55
|
+
end
|
56
|
+
|
57
|
+
def entry( *args )
|
58
|
+
sig( *args )
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
Nat = Integer
|
64
|
+
Money = Integer
|
65
|
+
KeyHash = String
|
66
|
+
Address = String
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
def Option( arg ) arg; end
|
72
|
+
|
73
|
+
_ = nil ## predefine "global" underscore variable
|
74
|
+
|
75
|
+
|
76
|
+
def failwith( msg, *args )
|
77
|
+
if args.size == 0
|
78
|
+
msg_inspect = msg
|
79
|
+
else
|
80
|
+
args_inspect = args.map { |arg| arg.inspect }.join( ", " )
|
81
|
+
msg_inspect = "#{msg}: #{args_inspect}"
|
82
|
+
end
|
83
|
+
fail msg_inspect
|
84
|
+
end
|
85
|
+
|
86
|
+
class Current
|
87
|
+
def self.amount=(value) @amount = value; end
|
88
|
+
def self.amount() @amount ||= 0; end
|
89
|
+
|
90
|
+
def self.sender=(value) @sender = value; end
|
91
|
+
def self.sender() @sender ||= "0x0000"; end
|
92
|
+
|
93
|
+
|
94
|
+
## todo/check: Current.failwith exits? - always use "global" failwith - why? why not?
|
95
|
+
def self.failwith( *args)
|
96
|
+
## hack: todo - is there a better way to call "global" outer failwith function/method ???
|
97
|
+
Object.send( :failwith, *args );
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
class Integer
|
104
|
+
def tz() self; end ## tezzies (cryptocurrency)
|
105
|
+
def p() self; end ## p(ositive) integer number (0... only)
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
def is_nat( num )
|
110
|
+
if num >=0
|
111
|
+
num ## a.k.a Some
|
112
|
+
else
|
113
|
+
nil ## a.k.a None
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
module Map
|
119
|
+
def self.find( key, map )
|
120
|
+
value = map[key]
|
121
|
+
value
|
122
|
+
end
|
123
|
+
|
124
|
+
def self.add( key, value, map )
|
125
|
+
map.merge( Hash[key,value] )
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.remove( key, map )
|
129
|
+
## todo: check if there's better way??
|
130
|
+
new_map = map.merge( {} )
|
131
|
+
new_map.delete( key )
|
132
|
+
new_map
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
module BigMap
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
def Object.const_missing( name )
|
142
|
+
puts "const_missing:"
|
143
|
+
pp name
|
144
|
+
if name.to_s.start_with?( "Map‹" )
|
145
|
+
Map
|
146
|
+
elsif name.to_s.start_with?( "BigMap‹" )
|
147
|
+
BigMap
|
148
|
+
else
|
149
|
+
super
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
|
154
|
+
def match( obj, matchers )
|
155
|
+
## pp obj
|
156
|
+
## pp matchers
|
157
|
+
## note: assume None/Some for now
|
158
|
+
if obj
|
159
|
+
matchers[:Some].call( obj )
|
160
|
+
else
|
161
|
+
## none
|
162
|
+
matchers[:None].call
|
163
|
+
end
|
164
|
+
end
|
data/lib/michelson/version.rb
CHANGED
data/test/helper.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# to run use
|
5
|
+
# ruby -I ./lib -I ./test test/test_counter.rb
|
6
|
+
|
7
|
+
|
8
|
+
require 'helper'
|
9
|
+
|
10
|
+
|
11
|
+
type :Storage, Integer
|
12
|
+
|
13
|
+
init [],
|
14
|
+
def storage()
|
15
|
+
0
|
16
|
+
end
|
17
|
+
|
18
|
+
entry [Integer],
|
19
|
+
def inc( by, storage )
|
20
|
+
[[], storage + by]
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
class TestCounter < MiniTest::Test
|
25
|
+
|
26
|
+
def test_storage
|
27
|
+
pp Storage
|
28
|
+
assert_equal Storage, Integer
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_call
|
32
|
+
storage = storage()
|
33
|
+
assert_equal 0, storage
|
34
|
+
|
35
|
+
_, storage = inc( 2, storage )
|
36
|
+
assert_equal 2, storage
|
37
|
+
|
38
|
+
_, storage = inc( 1, storage )
|
39
|
+
assert_equal 3, storage
|
40
|
+
end
|
41
|
+
|
42
|
+
end # class TestCounter
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: michelson
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
@@ -55,7 +55,10 @@ files:
|
|
55
55
|
- README.md
|
56
56
|
- Rakefile
|
57
57
|
- lib/michelson.rb
|
58
|
+
- lib/michelson/michelson.rb
|
58
59
|
- lib/michelson/version.rb
|
60
|
+
- test/helper.rb
|
61
|
+
- test/test_counter.rb
|
59
62
|
homepage: https://github.com/s6ruby/ruby-to-michelson
|
60
63
|
licenses:
|
61
64
|
- Public Domain
|