Skip to content

Commit 6f9f6e9

Browse files
committed
Make .open a classmethod
1 parent d6b3647 commit 6f9f6e9

File tree

8 files changed

+66
-80
lines changed

8 files changed

+66
-80
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ my_header_with_a_cool_comment = TIHeader(comment="Wow! I'm a comment!")
8181
Vars can be loaded from files or raw bytes:
8282

8383
```python
84-
my_var.open("HELLO.8xp")
84+
my_var = TIVar.open("HELLO.8xp")
8585

8686
# Note binary mode!
8787
with open("HELLO.8xp", 'rb') as file:
@@ -95,7 +95,7 @@ Entries can be loaded from files or raw bytes. When loading from a file, you may
9595

9696
```python
9797
# Raises an error if the var has multiple entries; use load_from_file instead
98-
my_program.open("HELLO.8xp")
98+
my_program = TIProgram.open("HELLO.8xp")
9999

100100
with open("HELLO.8xp", 'rb') as file:
101101
# Offset counts the number of entries to skip; defaults to zero
@@ -118,7 +118,7 @@ my_real.load_float(1.23)
118118
Base `TIEntry` objects, as well other parent types like `TIGDB`, will be automatically coerced to the correct type:
119119
```python
120120
# Coerces to a TIProgram
121-
my_entry.open("HELLO.8xp")
121+
my_entry = TIEntry.open("HELLO.8xp")
122122
```
123123

124124
Export a var as bytes or straight to a file:

examples/arrays.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,14 @@
44

55

66
# Turn a list into a NumPy array
7-
lst = TIRealList()
8-
lst.open("../tests/data/var/RealList.8xl")
7+
lst = TIRealList.open("../tests/data/var/RealList.8xl")
98

109
arr = np.asarray(lst.list(), dtype=float)
1110
print(arr)
1211

1312

1413
# Turn a matrix into a NumPy array
15-
matrix = TIMatrix()
16-
matrix.open("../tests/data/var/Matrix_3x3_standard.8xm")
14+
matrix = TIMatrix.open("../tests/data/var/Matrix_3x3_standard.8xm")
1715

1816
arr = np.asarray(matrix.matrix(), dtype=float)
1917
print(arr)

examples/pil.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111

1212

1313
# Alternatively, load the image manually
14-
ti_img = TIImage()
15-
ti_img.open("../tests/data/var/Image1.8ca")
14+
ti_img = TIImage.open("../tests/data/var/Image1.8ca")
1615

1716
arr = np.asarray(ti_img.array(), dtype=np.uint8)
1817
img = Image.fromarray(arr, mode=ti_img.pil_mode)

tests/pil.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@
2020

2121
class PILTests(unittest.TestCase):
2222
def test_8xi(self):
23-
ti_img = TIMonoPicture()
24-
ti_img.open("tests/data/var/BartSimpson.8xi")
23+
ti_img = TIMonoPicture.open("tests/data/var/BartSimpson.8xi")
2524

2625
arr = np.asarray(ti_img.array(), dtype=np.uint8)
2726
img = Image.open("tests/data/var/BartSimpson.8xi")
@@ -43,8 +42,7 @@ def the_palette_is_stinky(byte: int) -> bytes:
4342

4443
return bytes([16 * high + low])
4544

46-
ti_img = TIPicture()
47-
ti_img.open("tests/data/var/Pic1.8ci")
45+
ti_img = TIPicture.open("tests/data/var/Pic1.8ci")
4846

4947
arr = np.asarray(ti_img.array(), dtype=np.uint8)
5048
img = Image.open("tests/data/var/Pic1.8ci")
@@ -59,8 +57,7 @@ def the_palette_is_stinky(byte: int) -> bytes:
5957
self.assertEqual(buf.read()[72:-2].translate(trans), ti_img.calc_data.translate(trans))
6058

6159
def test_8ca(self):
62-
ti_img = TIImage()
63-
ti_img.open("tests/data/var/Image1.8ca")
60+
ti_img = TIImage.open("tests/data/var/Image1.8ca")
6461

6562
arr = np.asarray(ti_img.array(), dtype=np.uint8)
6663
img = Image.open("tests/data/var/Image1.8ca")

tests/tivars.py

Lines changed: 23 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ def test_all_models(self):
1818

1919
class VarTests(unittest.TestCase):
2020
def test_all_attributes(self):
21-
test_var = TIVar()
22-
test_var.open("tests/data/var/Program.8xp")
21+
test_var = TIVar.open("tests/data/var/Program.8xp")
2322

2423
self.assertEqual(test_var.header.magic, "**TI83F*")
2524
self.assertEqual(test_var.header.extra, b'\x1A\x0A')
@@ -36,8 +35,7 @@ def test_all_attributes(self):
3635
self.assertEqual(test_var.checksum, b'M\x03')
3736

3837
def test_all_sections(self):
39-
test_var = TIVar()
40-
test_var.open("tests/data/var/Program.8xp")
38+
test_var = TIVar.open("tests/data/var/Program.8xp")
4139

4240
self.assertEqual(test_var.header.raw.magic, b'**TI83F*')
4341
self.assertEqual(test_var.header.raw.extra, b'\x1A\x0A')
@@ -70,8 +68,7 @@ def test_all_sections(self):
7068
self.assertEqual(test_var.checksum, b'M\x03')
7169

7270
def test_multiple_entries(self):
73-
clibs = TIVar()
74-
clibs.open("tests/data/var/clibs.8xg")
71+
clibs = TIVar.open("tests/data/var/clibs.8xg")
7572

7673
self.assertEqual(len(clibs.entries), 9)
7774
self.assertTrue(all(entry.type_id == 0x15 for entry in clibs.entries))
@@ -83,8 +80,7 @@ def test_multiple_entries(self):
8380
self.assertEqual(second, clibs.entries[1])
8481

8582
def test_save_to_file(self):
86-
test_var = TIVar()
87-
test_var.open("tests/data/var/Program.8xp")
83+
test_var = TIVar.open("tests/data/var/Program.8xp")
8884

8985
self.assertEqual(test_var.extension, "8xp")
9086
self.assertEqual(test_var.filename, "UNNAMED.8xp")
@@ -98,10 +94,7 @@ def test_save_to_file(self):
9894
self.assertEqual(test_var.supported_by(TI_83), False)
9995

10096
def test_truthiness(self):
101-
test_var = TIVar()
102-
self.assertEqual(bool(test_var), False)
103-
104-
test_var.open("tests/data/var/clibs.8xg")
97+
test_var = TIVar.open("tests/data/var/clibs.8xg")
10598
self.assertEqual(bool(test_var), True)
10699

107100
test_var.clear()
@@ -110,11 +103,8 @@ def test_truthiness(self):
110103

111104
class EntryTests(unittest.TestCase):
112105
def test_save_to_file(self):
113-
test_program = TIEntry()
114-
test_header = TIHeader()
115-
116-
test_program.open("tests/data/var/Program.8xp")
117-
test_header.open("tests/data/var/Program.8xp")
106+
test_program = TIEntry.open("tests/data/var/Program.8xp")
107+
test_header = TIHeader.open("tests/data/var/Program.8xp")
118108

119109
test_program.save("tests/data/var/Program_new.8xp", header=test_header)
120110

@@ -141,20 +131,18 @@ def test_form_vars(self):
141131
self.assertEqual(test_header | [test_program], test_var)
142132

143133
def test_truthiness(self):
144-
test_program = TIEntry()
145-
self.assertEqual(bool(test_program), False)
134+
test_program = TIEntry.open("tests/data/var/Program.8xp")
135+
self.assertEqual(bool(test_program), True)
146136

147-
test_program.open("tests/data/var/Program.8xp")
137+
test_program.clear()
148138
self.assertEqual(bool(test_program), True)
149139

150140

151141
class TokenizationTests(unittest.TestCase):
152142
def test_load_from_file(self):
153-
test_var = TIVar()
154-
test_var.open("tests/data/var/Program.8xp")
143+
test_var = TIVar.open("tests/data/var/Program.8xp")
155144

156-
test_program = TIProgram()
157-
test_program.open("tests/data/var/Program.8xp")
145+
test_program = TIProgram.open("tests/data/var/Program.8xp")
158146

159147
self.assertEqual(test_program, test_var.entries[0])
160148

@@ -209,8 +197,7 @@ def test_protection(self):
209197

210198
class NumericTests(unittest.TestCase):
211199
def real_float_test(self, real_type, filename, name, sign, exponent, mantissa, string, dec):
212-
test_num = real_type()
213-
test_num.open(f"tests/data/var/{filename}.8xn")
200+
test_num = real_type.open(f"tests/data/var/{filename}.8xn")
214201

215202
self.assertEqual(test_num.name, name)
216203
self.assertEqual(test_num.sign, sign)
@@ -242,8 +229,7 @@ def test_real_pi_frac(self):
242229
Decimal("0.89759790102567"))
243230

244231
def test_real_radical(self):
245-
test_radical = TIRealRadical()
246-
test_radical.open("tests/data/var/Exact_RealRadical.8xn")
232+
test_radical = TIRealRadical.open("tests/data/var/Exact_RealRadical.8xn")
247233

248234
self.assertEqual(test_radical.sign_type, 2)
249235
self.assertEqual(test_radical.left_scalar, 41)
@@ -255,8 +241,7 @@ def test_real_radical(self):
255241
def complex_float_test(self, comp_type, filename, name, real_sign, real_exponent, real_mantissa,
256242
imag_sign, imag_exponent, imag_mantissa, string, comp):
257243

258-
test_num = comp_type()
259-
test_num.open(f"tests/data/var/{filename}.8xc")
244+
test_num = comp_type.open(f"tests/data/var/{filename}.8xc")
260245

261246
self.assertEqual(test_num.real.sign, real_sign)
262247
self.assertEqual(test_num.real.exponent, real_exponent)
@@ -315,8 +300,7 @@ def test_coercion(self):
315300

316301
class ArrayTests(unittest.TestCase):
317302
def test_real_list(self):
318-
test_real_list = TIRealList()
319-
test_real_list.open("tests/data/var/RealList.8xl")
303+
test_real_list = TIRealList.open("tests/data/var/RealList.8xl")
320304

321305
test_list = [TIReal("-1.0"), TIReal("2.0"), TIReal("999")]
322306

@@ -328,8 +312,7 @@ def test_real_list(self):
328312
self.assertEqual(f"{test_real_list:t}", "{~1,2,999}")
329313

330314
def test_complex_list(self):
331-
test_comp_list = TIComplexList()
332-
test_comp_list.open("tests/data/var/ComplexList.8xl")
315+
test_comp_list = TIComplexList.open("tests/data/var/ComplexList.8xl")
333316

334317
test_list = [TIComplex(1 + 1j), TIComplex("-3 + 2i"), TIComplex(4 + 0j)]
335318

@@ -341,8 +324,7 @@ def test_complex_list(self):
341324
self.assertEqual(f"{test_comp_list:t}", "{1+[i],~3+2[i],4}")
342325

343326
def test_matrix(self):
344-
test_matrix = TIMatrix()
345-
test_matrix.open("tests/data/var/Matrix_3x3_standard.8xm")
327+
test_matrix = TIMatrix.open("tests/data/var/Matrix_3x3_standard.8xm")
346328

347329
test_array = [[TIReal(0.5), TIReal(-1.0), TIReal("2.6457513110646")],
348330
[TIReal("2.7386127875258"), TIReal("0.5"), TIReal("3.1415926535898")],
@@ -362,8 +344,7 @@ def test_matrix(self):
362344
"[1,99999999,0]]")
363345

364346
def test_exact_matrix(self):
365-
test_matrix = TIMatrix()
366-
test_matrix.open("tests/data/var/Matrix_2x2_exact.8xm")
347+
test_matrix = TIMatrix.open("tests/data/var/Matrix_2x2_exact.8xm")
367348

368349
test_array = [[TIRealPi("3π"), TIRealRadical("3√10")],
369350
[TIRealFraction("1/2"), TIRealRadical("(4√5 + 2√3) / 7")]]
@@ -377,8 +358,7 @@ def test_exact_matrix(self):
377358

378359
class SettingsTests(unittest.TestCase):
379360
def test_window(self):
380-
test_window = TIWindowSettings()
381-
test_window.open("tests/data/var/Window.8xw")
361+
test_window = TIWindowSettings.open("tests/data/var/Window.8xw")
382362

383363
zero, one, undef = TIReal(0), TIReal(1), TIUndefinedReal(1)
384364
tau, pi_twenty_fourths = TIReal("6.283185307"), TIReal("0.13089969389957")
@@ -412,8 +392,7 @@ def test_window(self):
412392
self.assertEqual(test_window.Yscl, TIReal("2"))
413393

414394
def test_recall(self):
415-
test_recall = TIRecallWindow()
416-
test_recall.open("tests/data/var/RecallWindow.8xz")
395+
test_recall = TIRecallWindow.open("tests/data/var/RecallWindow.8xz")
417396

418397
zero, one, undef = TIReal("0"), TIReal("1"), TIUndefinedReal("1")
419398
tau, pi_twenty_fourths = TIReal(6.283185307), TIReal("0.13089969389957")
@@ -447,8 +426,7 @@ def test_recall(self):
447426
self.assertEqual(test_recall.Yscl, TIReal(1))
448427

449428
def test_table(self):
450-
test_table = TITableSettings()
451-
test_table.open("tests/data/var/TableRange.8xt")
429+
test_table = TITableSettings.open("tests/data/var/TableRange.8xt")
452430

453431
self.assertEqual(test_table.name, "TblSet")
454432
self.assertEqual(test_table.TblMin, TIReal(0.0))
@@ -457,8 +435,7 @@ def test_table(self):
457435

458436
class GDBTests(unittest.TestCase):
459437
def test_func_gdb(self):
460-
test_gdb = TIMonoGDB()
461-
test_gdb.open("tests/data/var/GraphDataBase.8xd")
438+
test_gdb = TIMonoGDB.open("tests/data/var/GraphDataBase.8xd")
462439

463440
self.assertEqual(type(test_gdb), TIFuncGDB)
464441
self.assertEqual(test_gdb.name, "GDB1")

tivars/data.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,4 +503,4 @@ def __set_name__(self, owner, name: str):
503503

504504

505505
__all__ = ["Section", "View", "Dock", "Loader",
506-
"Converter", "Bytes", "SizedData", "Boolean", "Integer", "String", "Bits"]
506+
"Converter", "Bytes", "Data", "SizedData", "Boolean", "Integer", "String", "Bits"]

tivars/types/list.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,11 @@ def data(self) -> bytes:
132132
pass
133133

134134
def get_min_os(self, data: bytes = None) -> OsVersion:
135-
it = zip(*[iter(data or self.data)] * RealEntry.min_data_length)
135+
it = zip(*[iter(data or self.data)] * self._E.min_data_length)
136136
return max(map(self._E().get_min_os, it), default=OsVersions.INITIAL)
137137

138138
def get_version(self, data: bytes = None) -> int:
139-
it = zip(*[iter(data or self.data)] * RealEntry.min_data_length)
139+
it = zip(*[iter(data or self.data)] * self._E.min_data_length)
140140
version = max(map(self._E().get_version, it), default=0x00)
141141

142142
if version > 0x1B:

0 commit comments

Comments
 (0)