Skip to content

Commit dd279c4

Browse files
[fixed #14] JSON format fixed
- fixed the JSON formatting - updated collection viewing to JSON export - refactored code and changed variable 'found' to 'visited'
1 parent 7697517 commit dd279c4

File tree

3 files changed

+40
-45
lines changed

3 files changed

+40
-45
lines changed

pyvba/browser.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
skip = ['Application', 'Parent']
66

77
# store a dictionary of the discovered items
8-
found = OrderedDict()
8+
visited = OrderedDict()
99

1010

1111
class Browser(Viewer):
@@ -42,8 +42,8 @@ def from_viewer(viewer, parent=None):
4242
@staticmethod
4343
def clr_found():
4444
"""Clears the stored dictionary of items browsed."""
45-
global found
46-
found = OrderedDict()
45+
global visited
46+
visited = OrderedDict()
4747

4848
@staticmethod
4949
def skip(*item: str):
@@ -76,7 +76,7 @@ def all(self) -> dict:
7676

7777
def _generate(self):
7878
"""Iterates through all objects when called upon."""
79-
global skip, found
79+
global skip, visited
8080

8181
# iterate through items
8282
for name in self._objects + [i.name for i in self._methods]:
@@ -96,16 +96,16 @@ def _generate(self):
9696
self._errors[name] = e.args
9797
continue
9898

99-
# add items to the 'found' dictionary
99+
# add items to the visited dictionary
100100
for name, value in self._all.items():
101101
if isinstance(value, Viewer):
102-
if value.type not in found:
103-
found[value.type] = []
102+
if value.type not in visited:
103+
visited[value.type] = []
104104

105-
if value not in found[value.type]:
106-
found[value.type].append(value)
105+
if value not in visited[value.type]:
106+
visited[value.type].append(value)
107107
else:
108-
self._all[name] = found[value.type].index(value)
108+
self._all[name] = visited[value.type].index(value)
109109

110110
def search(self, name: str, exact: bool = False):
111111
"""Return a dictionary in format {path: item} matching the name.

pyvba/export.py

Lines changed: 25 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import os
22
import re
33

4-
from pyvba.browser import Browser, CollectionBrowser
4+
from pyvba.browser import Browser
55
from pyvba.viewer import FunctionViewer
66

77

@@ -98,7 +98,6 @@ def __init__(self, browser: Browser, version=1.0, encoding: str = "UTF-8", skip_
9898
super().__init__(browser, skip_func, skip_err)
9999

100100
self._xml_head = f'<?xml version="{str(version)}" encoding="{encoding}"?>\n'
101-
self._attrs = ['Name', 'Count']
102101

103102
@staticmethod
104103
def xml_encode(text: str) -> str:
@@ -153,7 +152,7 @@ def _generate_tag(self, elem, tabs: int = 0, **kwargs) -> str:
153152
xml += '\t' * (tabs + 1) + item_tag.close_tag + '\n'
154153

155154
elif item not in attrs:
156-
# NOTE: this is here
155+
# overlook objects that call itself
157156
if item == elem.name:
158157
continue
159158
else:
@@ -272,7 +271,7 @@ def json_encode(text: str) -> str:
272271
def _check(self):
273272
"""Check if the JSON string needs to be generated."""
274273
if self._data is None:
275-
self._data = "{\n" + self._generate(self._browser, 1) + "}\n"
274+
self._data = self._generate(self._browser)
276275
self._data = re.sub(r',(?!\s*?[{\[\"\'\w])', '', self._data)
277276

278277
def _generate(self, elem, tabs: int = 0, **kwargs) -> str:
@@ -294,46 +293,38 @@ def _generate(self, elem, tabs: int = 0, **kwargs) -> str:
294293
json = ''
295294
if isinstance(elem, Browser):
296295
# display the browser and its children
297-
json += "\t" * tabs + f"\"{self.json_encode(elem.name)}\": {{\n"
296+
json += "\t" * tabs + f"{{ \"{self.json_encode(elem.name)}\": [\n"
298297

299298
for item, value in elem.all.items():
300-
json += self._generate(value, tabs + 1, name=item)
301-
302-
json += "\t" * tabs + "},\n"
303-
# elif isinstance(elem, IterableFunctionBrowser):
304-
# # display the function browser and its children
305-
# json += "\t" * tabs + f"\"{elem.name}\": {{\n"
306-
# json += "\t" * (tabs + 1) + f"\"Name\": \"{self.json_encode(elem.name)}\",\n"
307-
# json += "\t" * (tabs + 1) + f"\"Count\": {elem.count},\n"
308-
# json += "\t" * (tabs + 1) + f"\"Items\": [\n"
309-
#
310-
# for item, value in elem.all.items():
311-
# json += "\t" * (tabs + 2) + "{\n"
312-
# json += self._generate(value, tabs + 3, name=item)
313-
# json += "\t" * (tabs + 2) + "},\n"
314-
#
315-
# json += "\t" * (tabs + 1) + "]\n"
316-
# json += "\t" * tabs + "},\n"
299+
if type(value) is list and len(value) > 0:
300+
json += "\t" * (tabs + 1) + "{ \"Item\": [\n"
301+
for i in value:
302+
json += self._generate(i, tabs + 2)
303+
json += "\t" * (tabs + 1) + "]},\n"
304+
else:
305+
json += self._generate(value, tabs + 1, name=item)
306+
307+
json += "\t" * tabs + "]},\n"
317308
elif isinstance(elem, FunctionViewer):
318309
if not self._skip_func:
319310
# display the function and its properties
320-
json += "\t" * tabs + f"\"{self.json_encode(elem.name)}\": {{\n"
321-
json += "\t" * (tabs + 1) + f"\"Name\": \"{self.json_encode(elem.name)}\",\n"
322-
json += "\t" * (tabs + 1) + f"\"args\": {self.json_encode(str(len(elem.args)))},\n"
323-
json += "\t" * (tabs + 1) + f"\"use\": \"{self.json_encode(str(elem)[26:])}\"\n"
324-
json += "\t" * tabs + "},\n"
311+
json += "\t" * tabs + f"{{ \"{self.json_encode(elem.name)}\": [\n"
312+
json += "\t" * (tabs + 1) + f"{{ \"Name\": \"{self.json_encode(elem.name)}\" }},\n"
313+
json += "\t" * (tabs + 1) + f"{{ \"args\": {self.json_encode(str(len(elem.args)))} }},\n"
314+
json += "\t" * (tabs + 1) + f"{{ \"use\": \"{self.json_encode(str(elem)[26:])}\" }}\n"
315+
json += "\t" * tabs + "]},\n"
325316
elif isinstance(elem, BaseException):
326317
# display the error location and method
327318
if not self._skip_err:
328-
json += "\t" * tabs + "\"Error\": {\n"
319+
json += "\t" * tabs + "{ \"Error\": [\n"
329320
try:
330-
json += "\t" * (tabs + 1) + f"\"on\": \"{self.json_encode(str(elem.args[2][1]))}\",\n"
331-
json += "\t" * (tabs + 1) + f"\"message\": \"{self.json_encode(str(elem.args[2][2]))}\"\n"
321+
json += "\t" * (tabs + 1) + f"{{ \"on\": \"{self.json_encode(str(elem.args[2][1]))}\" }},\n"
322+
json += "\t" * (tabs + 1) + f"{{ \"message\": \"{self.json_encode(str(elem.args[2][2]))}\" }}\n"
332323
except TypeError:
333-
json += "\t" * (tabs + 1) + f"\"message\": \"{self.json_encode(str(elem.args[2]))}\"\n"
324+
json += "\t" * (tabs + 1) + f"{{ \"message\": \"{self.json_encode(str(elem.args[2]))}\" }}\n"
334325
except IndexError:
335-
json += "\t" * (tabs + 1) + f"\"message\": \"{self.json_encode(str(elem))}\"\n"
336-
json += "\t" * tabs + "},\n"
326+
json += "\t" * (tabs + 1) + f"{{ \"message\": \"{self.json_encode(str(elem))}\" }}\n"
327+
json += "\t" * tabs + "]},\n"
337328
else:
338329
# display the variable and value
339330
name = self.json_encode(kwargs.get('name', 'Unknown'))
@@ -343,5 +334,5 @@ def _generate(self, elem, tabs: int = 0, **kwargs) -> str:
343334
elif not isinstance(elem, (int, float, complex)):
344335
elem = f"\"{self.json_encode(str(elem))}\""
345336

346-
json += "\t" * tabs + f"\"{name}\": {elem},\n"
337+
json += "\t" * tabs + f"{{ \"{name}\": {elem} }},\n"
347338
return json

pyvba/viewer.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,11 @@ def __init__(self, obj, name: str = None, parent: object = None):
187187
super().__init__(obj, name, parent)
188188

189189
self._count = len(self._com)
190-
self._items = [Viewer.gettype(i, name, self) for i in self._com if i is not super()._com]
190+
self._items = [
191+
Viewer.gettype(i, name, self)
192+
for i in self._com
193+
if i is not super()._com
194+
]
191195

192196
def __str__(self):
193197
return super().__str__().replace('Viewer', 'CollectionViewer')

0 commit comments

Comments
 (0)