• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Beakerboy / MS-OVBA / 22999878898

12 Mar 2026 11:32AM UTC coverage: 86.647%. First build
22999878898

Pull #124

github

web-flow
Merge 171417af2 into 931c97dc1
Pull Request #124: Rename tests/Unit/Models/test_vbaProject.py to tests/Unit/test_vbaPro…

116 of 119 new or added lines in 12 files covered. (97.48%)

597 of 689 relevant lines covered (86.65%)

4.33 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

94.59
/src/ms_ovba/Models/Entities/module_base.py
1
from ms_ovba_compression.ms_ovba import MsOvba
5✔
2
from ms_ovba.Models.Fields.doubleEncodedString import (
5✔
3
    DoubleEncodedString
4
)
5
from ms_ovba.Models.Fields.packed_data import PackedData
5✔
6
from ms_ovba.Models.Fields.idSizeField import IdSizeField
5✔
7
from typing import TypeVar
5✔
8

9

10
T = TypeVar('T', bound='ModuleBase')
5✔
11

12

13
class ModuleBase():
5✔
14
    def __init__(self: T, name: str) -> None:
5✔
15
        """
16
        Initialize the module record
17
        """
18
        self.modName = DoubleEncodedString([0x0019, 0x0047], name)
5✔
19
        self.streamName = DoubleEncodedString([0x001A, 0x0032], name)
5✔
20
        self.docString = DoubleEncodedString([0x001C, 0x0048], "")
5✔
21
        self.helpContext = IdSizeField(0x001E, 4, 0)
5✔
22
        self._cookie = IdSizeField(0x002C, 2, 0xFFFF)
5✔
23

24
        # self.readonly = SimpleRecord(0x001E, 4, helpContext)
25
        # self.private = SimpleRecord(0x001E, 4, helpContext)
26
        self._cache = b''
5✔
27
        self.workspace = [0, 0, 0, 0, 'C']
5✔
28
        self.type = ''
5✔
29
        self.created = 0
5✔
30
        self.modified = 0
5✔
31
        self._fileSize = 0
5✔
32
        self._size = 0
5✔
33

34
        # GUIDs
35
        self._guids = []
5✔
36

37
    @property
5✔
38
    def guids(self: T) -> str:
5✔
NEW
39
        return self._guids
×
40

41
    @guids.setter
5✔
42
    def guids(self: T, guid: str) -> None:
5✔
43
        if isinstance(guid, list):
×
NEW
44
            self._guids = guid
×
45
        else:
NEW
46
            self._guids = [guid]
×
47

48
    def add_guid(self: T, guid: str) -> None:
5✔
49
        """
50
        Append a guid to the list
51
        """
52
        self._guid += [guid]
5✔
53

54
    @property
5✔
55
    def cache(self: T) -> bytes:
5✔
56
        return self._cache
5✔
57

58
    @cache.setter
5✔
59
    def cache(self: T, cache: bytes) -> None:
5✔
60
        self._cache = cache
5✔
61

62
    @property
5✔
63
    def cookie(self: T) -> int:
5✔
64
        return self._cookie.value
5✔
65

66
    @cookie.setter
5✔
67
    def cookie(self: T, value: int) -> None:
5✔
68
        self._cookie = IdSizeField(0x002C, 2, value)
5✔
69

70
    @property
5✔
71
    def name(self: T) -> str:
5✔
72
        return self.modName.value
5✔
73

74
    @property
5✔
75
    def bin_path(self: T) -> str:
5✔
76
        return self._file_path + ".bin"
5✔
77

78
    def add_workspace(self: T, val1: int, val2: int,
5✔
79
                      val3: int, val4: int, val5: int) -> None:
80
        self.workspace = [val1, val2, val3, val4, val5]
5✔
81

82
    def pack(self: T, endien: str, cp_name: str) -> bytes:
5✔
83
        """
84
        Pack the metadata for use in the dir stream.
85
        """
86
        typeid_value = 0x0022 if self.type == 'Document' else 0x0021
5✔
87
        type_id = PackedData("HI", typeid_value, 0)
5✔
88
        self.offsetRec = IdSizeField(0x0031, 4, len(self._cache))
5✔
89
        output = (self.modName.pack(endien, cp_name)
5✔
90
                  + self.streamName.pack(endien, cp_name)
91
                  + self.docString.pack(endien, cp_name)
92
                  + self.offsetRec.pack(endien)
93
                  + self.helpContext.pack(endien, cp_name)
94
                  + self._cookie.pack(endien)
95
                  + type_id.pack(endien))
96
        footer = PackedData("HI", 0x002B, 0)
5✔
97
        output += footer.pack(endien)
5✔
98
        return output
5✔
99

100
    def to_project_module_string(self: T) -> str:
5✔
101
        return self.type + "=" + self.modName.value
5✔
102

103
    def add_file(self: T, file_path: str) -> None:
5✔
104
        self._file_path = file_path
5✔
105

106
    def write_file(self: T) -> None:
5✔
107
        bin_f = open(self._file_path + ".bin", "wb")
5✔
108
        bin_f.write(self._cache)
5✔
109
        with open(self._file_path + ".new", mode="rb") as new_f:
5✔
110
            contents = new_f.read()
5✔
111
        ms_ovba = MsOvba()
5✔
112
        compressed = ms_ovba.compress(contents)
5✔
113
        bin_f.write(compressed)
5✔
114
        bin_f.close()
5✔
115

116
    def _attr(self: T, name: str, value: str) -> str:
5✔
117
        return 'Attribute VB_' + name + ' = ' + value + '\n'
5✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc