Skip to content

Commit

Permalink
Merge branch 'master' of github.com:algorand-devrel/beaker
Browse files Browse the repository at this point in the history
  • Loading branch information
barnjamin committed Sep 16, 2022
2 parents c2fcc3f + fee802d commit 3486995
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,6 @@ __pycache__/
.coverage
docs/build/
dist/*

# Pyenv
.python-version
10 changes: 10 additions & 0 deletions beaker/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,10 @@ def get_must(self) -> Expr:
def get_else(self, val: Expr) -> Expr:
"""gets the value stored at the key. if none is stored, return the value passed"""

@abstractmethod
def exists(self) -> Expr:
"""checks if the value is set (to whatever value. Returns Int(1) if value is set, Int(0) otherwise."""

@abstractmethod
def delete(self) -> Expr:
"""deletes the key from state, if the value is static it will be a compile time error"""
Expand Down Expand Up @@ -200,6 +204,9 @@ def get_else(self, val: Expr) -> Expr:

return If((v := App.globalGetEx(Int(0), self.key)).hasValue(), v.value(), val)

def exists(self) -> Expr:
return Seq(val := self.get_maybe(), val.hasValue())

def delete(self) -> Expr:
check_not_static(self)

Expand Down Expand Up @@ -305,6 +312,9 @@ def get_else(self, val: Expr) -> Expr:
val,
)

def exists(self) -> Expr:
return Seq(val := self.get_maybe(), val.hasValue())

def delete(self) -> Expr:
if self.key is None:
raise TealInputError(f"AccountStateValue {self} has no key defined")
Expand Down
28 changes: 28 additions & 0 deletions beaker/state_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,13 @@ def do_lv_test(key, stack_type, default, val):
with pt.TealComponent.Context.ignoreExprEquality(), pt.TealComponent.Context.ignoreScratchSlotEquality():
assert actual == expected

actual = lv.exists().__teal__(options)
expected = pt.Seq(
(v := pt.App.localGetEx(pt.Txn.sender(), pt.Int(0), key)), v.hasValue()
).__teal__(options)
with pt.TealComponent.Context.ignoreExprEquality(), pt.TealComponent.Context.ignoreScratchSlotEquality():
assert actual == expected

actual = lv.delete().__teal__(options)
expected = pt.App.localDel(pt.Txn.sender(), key).__teal__(options)
with pt.TealComponent.Context.ignoreExprEquality():
Expand Down Expand Up @@ -202,6 +209,13 @@ def do_dynamic_lv_test(stack_type, max_keys, key_gen, key_seed, val):
with pt.TealComponent.Context.ignoreExprEquality(), pt.TealComponent.Context.ignoreScratchSlotEquality():
assert actual == expected

actual = lv.exists().__teal__(options)
expected = pt.Seq(
(v := pt.App.localGetEx(pt.Txn.sender(), pt.Int(0), key)), v.hasValue()
).__teal__(options)
with pt.TealComponent.Context.ignoreExprEquality(), pt.TealComponent.Context.ignoreScratchSlotEquality():
assert actual == expected

actual = lv.delete().__teal__(options)
expected = pt.App.localDel(pt.Txn.sender(), key).__teal__(options)
with pt.TealComponent.Context.ignoreExprEquality():
Expand Down Expand Up @@ -322,6 +336,13 @@ def do_gv_test(key, stack_type, default, val, static):
with pt.TealComponent.Context.ignoreExprEquality(), pt.TealComponent.Context.ignoreScratchSlotEquality():
assert actual == expected

actual = lv.exists().__teal__(options)
expected = pt.Seq((v := pt.App.globalGetEx(pt.Int(0), key)), v.hasValue()).__teal__(
options
)
with pt.TealComponent.Context.ignoreExprEquality(), pt.TealComponent.Context.ignoreScratchSlotEquality():
assert actual == expected

actual = lv.delete().__teal__(options)
expected = pt.App.globalDel(key).__teal__(options)
with pt.TealComponent.Context.ignoreExprEquality():
Expand Down Expand Up @@ -441,6 +462,13 @@ def do_dynamic_gv_test(stack_type, max_keys, key_gen, key_seed, val):
with pt.TealComponent.Context.ignoreExprEquality(), pt.TealComponent.Context.ignoreScratchSlotEquality():
assert actual == expected

actual = lv.exists().__teal__(options)
expected = pt.Seq((v := pt.App.globalGetEx(pt.Int(0), key)), v.hasValue()).__teal__(
options
)
with pt.TealComponent.Context.ignoreExprEquality(), pt.TealComponent.Context.ignoreScratchSlotEquality():
assert actual == expected

actual = lv.delete().__teal__(options)
expected = pt.App.globalDel(key).__teal__(options)
with pt.TealComponent.Context.ignoreExprEquality():
Expand Down

0 comments on commit 3486995

Please sign in to comment.