summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/test_core.py9
-rw-r--r--viewstate/__init__.py48
-rw-r--r--viewstate/__main__.py12
-rw-r--r--viewstate/core.py48
-rw-r--r--viewstate/exceptions.py4
5 files changed, 70 insertions, 51 deletions
diff --git a/tests/test_core.py b/tests/test_core.py
index 3eed24c..6d4a8d5 100644
--- a/tests/test_core.py
+++ b/tests/test_core.py
@@ -1,6 +1,6 @@
import pytest
-from viewstate import ViewState
+from viewstate import *
class TestViewState(object):
@@ -9,14 +9,13 @@ class TestViewState(object):
vs = ViewState()
assert not vs.is_valid()
- @pytest.mark.skip(reason='Missing test data')
def test_is_valid(self):
- with open('samples/ngcs.sample', 'r') as f:
+ with open('tests/samples/ngcs.sample', 'r') as f:
vs = ViewState(f.read())
- self.assertTrue(vs.is_valid())
+ assert vs.is_valid() is True
def test_invalid_decode(self):
- with pytest.raises(Exception):
+ with pytest.raises(ViewStateException):
vs = ViewState()
vs.raw = b'\x01\x02'
vs.decode()
diff --git a/viewstate/__init__.py b/viewstate/__init__.py
index b75cd37..c166e0c 100644
--- a/viewstate/__init__.py
+++ b/viewstate/__init__.py
@@ -1,47 +1,3 @@
-from base64 import b64decode, b64encode
+from .core import ViewState
+from .exceptions import ViewStateException
-
-CONSTS = {
- 100: {},
- 101: '',
- 102: 0,
- 103: True,
- 104: False
-}
-
-def parse_const(b):
- return CONSTS.get(b, None)
-
-def parse(b):
- assert type(b) == bytes().__class__
- if len(b) == 1:
- return parse_const(b[0])
- return None
-
-
-class ViewState(object):
-
- def __init__(self, base64=''):
- self.base64 = base64
- self.raw = b64decode(self.base64)
- self.decoded = None
-
- @property
- def preamble(self):
- return self.raw[:2]
-
- @property
- def body(self):
- return self.raw[2:]
-
- def is_valid(self):
- format_marker = b'\xff'
- version_marker = b'\x01'
- preamble = format_marker + version_marker
- return self.preamble == preamble
-
- def decode(self):
- if not self.is_valid():
- raise Exception('Cannot decode invalid viewstate, bad preamble')
- self.decoded = parse(self.body)
- return self.decoded
diff --git a/viewstate/__main__.py b/viewstate/__main__.py
new file mode 100644
index 0000000..aa2e25d
--- /dev/null
+++ b/viewstate/__main__.py
@@ -0,0 +1,12 @@
+import sys
+
+from .core import ViewState
+
+def main():
+ s = sys.stdin.read()
+ vs = ViewState(s)
+ print('Got: ' + s)
+ print(vs.decode())
+
+if __name__ == '__main__':
+ main()
diff --git a/viewstate/core.py b/viewstate/core.py
new file mode 100644
index 0000000..347ee59
--- /dev/null
+++ b/viewstate/core.py
@@ -0,0 +1,48 @@
+from base64 import b64decode, b64encode
+
+from .exceptions import ViewStateException
+
+CONSTS = {
+ 100: {},
+ 101: '',
+ 102: 0,
+ 103: True,
+ 104: False
+}
+
+def parse_const(b):
+ return CONSTS.get(b, None)
+
+def parse(b):
+ assert type(b) == bytes().__class__
+ if len(b) == 1:
+ return parse_const(b[0])
+ return None
+
+
+class ViewState(object):
+
+ def __init__(self, base64=''):
+ self.base64 = base64
+ self.raw = b64decode(self.base64)
+ self.decoded = None
+
+ @property
+ def preamble(self):
+ return self.raw[:2]
+
+ @property
+ def body(self):
+ return self.raw[2:]
+
+ def is_valid(self):
+ format_marker = b'\xff'
+ version_marker = b'\x01'
+ preamble = format_marker + version_marker
+ return self.preamble == preamble
+
+ def decode(self):
+ if not self.is_valid():
+ raise ViewStateException('Cannot decode invalid viewstate, bad preamble')
+ self.decoded = parse(self.body)
+ return self.decoded
diff --git a/viewstate/exceptions.py b/viewstate/exceptions.py
new file mode 100644
index 0000000..d9f6eda
--- /dev/null
+++ b/viewstate/exceptions.py
@@ -0,0 +1,4 @@
+
+
+class ViewStateException(Exception):
+ pass