Skip to content

Commit aba7e54

Browse files
Sonar fixes (#140)
* Fix missing https URL * Remove unneded file * Fix bugs and security issues * Fixes some issues. Refactor Log, add unit tests.
1 parent b98739c commit aba7e54

File tree

11 files changed

+194
-166
lines changed

11 files changed

+194
-166
lines changed

.github/workflows/sonar.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ jobs:
3636
- name: Test Install RIDE
3737
run: pip install .
3838
- name: Run RIDE unit-tests
39-
run: invoke test-ci
39+
run: |
40+
export DISPLAY=:1
41+
invoke test-ci
4042
- name: Analyze with SonarCloud
4143
uses: sonarsource/sonarcloud-github-action@master
4244
with:

src/bin/setup.py

Lines changed: 0 additions & 23 deletions
This file was deleted.

src/robotide/editor/customsourceeditor.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,8 @@ def GetConfig():
971971
def main(filepath, frame=None):
972972
__name__ = 'Editor'
973973
app = wx.App()
974-
frame = wx.Frame(None)
974+
if frame is None:
975+
frame = wx.Frame(None)
975976
panel = CodeEditorPanel(frame, None, filepath)
976977
frame.Show(True)
977978
app.MainLoop()

src/robotide/log/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@
1414
# limitations under the License.
1515

1616
from .log import LogPlugin
17+
from .logwindow import LogWindow, message_to_string

src/robotide/log/log.py

Lines changed: 9 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,12 @@
2121
import tempfile
2222
import uuid
2323

24-
import wx
25-
from wx import Colour
26-
24+
from .logwindow import LogWindow, message_to_string
2725
from .. import context
2826
from .. import widgets
2927
from ..pluginapi import Plugin
3028
from ..action import ActionInfo
3129
from ..publish.messages import RideLog
32-
from ..widgets import RIDEDialog
33-
34-
35-
def _message_to_string(msg):
36-
return '%s [%s]: %s\n\n' % (msg.timestamp, msg.level, msg.message)
3730

3831

3932
class LogPlugin(Plugin):
@@ -44,6 +37,7 @@ def __init__(self, app):
4437
'log_to_console': False,
4538
'log_to_file': True
4639
})
40+
self.title = 'RIDE Log'
4741
self._log = []
4842
self._panel = None
4943
self._path = os.path.join(
@@ -56,15 +50,14 @@ def _close(self):
5650
if self._outfile is not None:
5751
self._outfile.close()
5852

59-
def _remove_old_log_files(self):
53+
@staticmethod
54+
def _remove_old_log_files():
6055
for fname in glob.glob(
6156
os.path.join(tempfile.gettempdir(), '*-ride.log')):
6257
try:
6358
os.remove(fname)
64-
except OSError or IOError or PermissionError as e:
59+
except (OSError, IOError) as e:
6560
sys.stderr.write(f"Removing old *-ride.log files failed with: {repr(e)}\n")
66-
finally:
67-
pass
6861

6962
@property
7063
def _logfile(self):
@@ -92,72 +85,20 @@ def _log_message(self, message):
9285
if self._panel:
9386
self._panel.update_log()
9487
if self.log_to_console:
95-
print('{}'.format(_message_to_string(message)))
88+
print('{}'.format(message_to_string(message)))
9689
if self.log_to_file:
97-
self._logfile.write(_message_to_string(message))
90+
self._logfile.write(message_to_string(message))
9891
self._outfile.flush()
9992
if message.notify_user:
10093
font_size = 13 if context.IS_MAC else -1
10194
widgets.HtmlDialog(message.level, message.message,
10295
padding=10, font_size=font_size).Show()
10396

10497
def OnViewLog(self, event):
98+
_ = event
10599
if not self._panel:
106-
self._panel = _LogWindow(self.notebook, self._log)
100+
self._panel = LogWindow(self.notebook, self.title, self._log)
107101
self._panel.update_log()
108102
self.register_shortcut('CtrlCmd-C', lambda e: self._panel.Copy())
109103
else:
110104
self.notebook.show_tab(self._panel)
111-
112-
113-
class _LogWindow(wx.Panel):
114-
115-
def __init__(self, notebook, log):
116-
wx.Panel.__init__(self, notebook)
117-
self.dlg = RIDEDialog()
118-
self._output = wx.TextCtrl(self, style=wx.TE_READONLY | wx.TE_MULTILINE | wx.TE_NOHIDESEL)
119-
self._output.SetBackgroundColour(Colour(self.dlg.color_background))
120-
self._output.SetForegroundColour(Colour(self.dlg.color_foreground))
121-
self._output.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
122-
self._log = log
123-
self._add_to_notebook(notebook)
124-
self.SetFont(widgets.Font().fixed_log)
125-
self.Bind(wx.EVT_SIZE, self.OnSize)
126-
127-
def _create_ui(self):
128-
self.SetSizer(widgets.VerticalSizer())
129-
self.Sizer.add_expanding(self._output)
130-
131-
def _add_to_notebook(self, notebook):
132-
notebook.add_tab(self, 'RIDE Log', allow_closing=True)
133-
notebook.show_tab(self)
134-
self._output.SetSize(self.Size)
135-
136-
def close(self, notebook):
137-
notebook.delete_tab(self)
138-
139-
def update_log(self):
140-
self._output.SetValue(self._decode_log(self._log))
141-
142-
def _decode_log(self, log):
143-
result = ''
144-
for msg in log:
145-
result += _message_to_string(msg)
146-
return result
147-
148-
def OnSize(self, evt):
149-
self._output.SetSize(self.Size)
150-
151-
def OnKeyDown(self, event):
152-
keycode = event.GetKeyCode()
153-
154-
if event.ControlDown() and keycode == ord('A'):
155-
self.SelectAll()
156-
else:
157-
event.Skip()
158-
159-
def Copy(self):
160-
pass
161-
162-
def SelectAll(self):
163-
self._output.SetSelection(-1, -1)

src/robotide/log/logwindow.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# Copyright 2008-2015 Nokia Networks
2+
# Copyright 2016- Robot Framework Foundation
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
16+
import wx
17+
from wx import Colour
18+
19+
from .. import widgets
20+
from ..widgets import RIDEDialog
21+
22+
23+
def message_to_string(msg, parserlog=False):
24+
message = msg.message.replace('\n\t', '') if parserlog else msg.message
25+
return '%s [%s]: %s\n\n' % (msg.timestamp, msg.level, message)
26+
27+
28+
class LogWindow(wx.Panel):
29+
30+
def __init__(self, notebook, title, log):
31+
wx.Panel.__init__(self, notebook)
32+
self.dlg = RIDEDialog()
33+
self.title = title
34+
self._removetabs = self.title == 'Parser Log'
35+
self._output = wx.TextCtrl(self, style=wx.TE_READONLY | wx.TE_MULTILINE | wx.TE_NOHIDESEL)
36+
self._output.SetBackgroundColour(Colour(self.dlg.color_background))
37+
self._output.SetForegroundColour(Colour(self.dlg.color_foreground))
38+
self._output.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
39+
self._log = log
40+
self._add_to_notebook(notebook)
41+
self.SetFont(widgets.Font().fixed_log)
42+
self.Bind(wx.EVT_SIZE, self.OnSize)
43+
44+
def _create_ui(self):
45+
self.SetSizer(widgets.VerticalSizer())
46+
self.Sizer.add_expanding(self._output)
47+
48+
def _add_to_notebook(self, notebook):
49+
notebook.add_tab(self, self.title, allow_closing=True)
50+
notebook.show_tab(self)
51+
self._output.SetSize(self.Size)
52+
53+
def close(self, notebook):
54+
notebook.delete_tab(self)
55+
56+
def update_log(self):
57+
self._output.SetValue(self._decode_log(self._log))
58+
59+
def _decode_log(self, log):
60+
result = ''
61+
for msg in log:
62+
result += message_to_string(msg, self._removetabs)
63+
return result
64+
65+
def OnSize(self, evt):
66+
_ = evt
67+
self._output.SetSize(self.Size)
68+
69+
def OnKeyDown(self, event):
70+
keycode = event.GetKeyCode()
71+
72+
if event.ControlDown() and keycode == ord('A'):
73+
self.SelectAll()
74+
else:
75+
event.Skip()
76+
77+
def Copy(self):
78+
""" Overriden in purpose """
79+
pass
80+
81+
def SelectAll(self):
82+
self._output.SetSelection(-1, -1)

src/robotide/parserlog/parserlog.py

Lines changed: 10 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,24 @@
2121
import uuid
2222

2323
import wx
24-
from wx import Colour
2524

2625
from .. import context
2726
from .. import widgets
27+
from ..log import LogWindow, message_to_string
2828
from ..pluginapi import Plugin
2929
from ..action import ActionInfo
3030
from ..publish.messages import RideParserLogMessage
31-
from ..widgets import RIDEDialog
32-
33-
def _message_to_string(msg):
34-
return '%s [%s]: %s\n\n' % (msg.timestamp, msg.level, msg.message.replace('\n\t', ''))
3531

3632

3733
class ParserLogPlugin(Plugin):
38-
"""Viewer for internal log messages."""
34+
"""Viewer for parser log messages."""
3935

4036
def __init__(self, app):
4137
Plugin.__init__(self, app, default_settings={
4238
'log_to_console': False,
4339
'log_to_file': True
4440
})
41+
self.title = 'Parser Log'
4542
self._log = []
4643
self._panel = None
4744
self._path = os.path.join(
@@ -54,15 +51,14 @@ def _close(self):
5451
if self._outfile is not None:
5552
self._outfile.close()
5653

57-
def _remove_old_log_files(self):
54+
@staticmethod
55+
def _remove_old_log_files():
5856
for fname in glob.glob(
5957
os.path.join(tempfile.gettempdir(), '*-ride_parser.log')):
6058
try:
6159
os.remove(fname)
62-
except OSError or IOError or PermissionError as e:
60+
except (OSError, IOError) as e:
6361
sys.stderr.write(f"Removing old *-ride_parser.log files failed with: {repr(e)}\n")
64-
finally:
65-
pass
6662

6763
@property
6864
def _logfile(self):
@@ -90,9 +86,9 @@ def _log_message(self, message):
9086
if self._panel:
9187
self._panel.update_log()
9288
if self.log_to_console:
93-
print("".format(_message_to_string(message))) # >> sys.stdout, _message_to_string(message)
89+
print("{}".format(message_to_string(message, True))) # >> sys.stdout, _message_to_string(message)
9490
if self.log_to_file:
95-
self._logfile.write(_message_to_string(message))
91+
self._logfile.write(message_to_string(message, True))
9692
self._outfile.flush()
9793
if message.notify_user:
9894
font_size = 13 if context.IS_MAC else -1
@@ -101,63 +97,11 @@ def _log_message(self, message):
10197
self.OnViewLog(message, show_tab=False)
10298

10399
def OnViewLog(self, event, show_tab=True):
100+
_ = event
104101
if not self._panel:
105-
self._panel = _LogWindow(self.notebook, self._log)
102+
self._panel = LogWindow(self.notebook, self.title, self._log)
106103
self.notebook.SetPageTextColour(self.notebook.GetPageCount()-1, wx.Colour(255, 165, 0))
107104
self._panel.update_log()
108105
self.register_shortcut('CtrlCmd-C', lambda e: self._panel.Copy())
109106
if show_tab:
110107
self.notebook.show_tab(self._panel)
111-
112-
113-
class _LogWindow(wx.Panel):
114-
115-
def __init__(self, notebook, log):
116-
wx.Panel.__init__(self, notebook)
117-
self.dlg = RIDEDialog()
118-
self._output = wx.TextCtrl(self, style=wx.TE_READONLY | wx.TE_MULTILINE | wx.TE_NOHIDESEL)
119-
self._output.SetBackgroundColour(Colour(self.dlg.color_background))
120-
self._output.SetForegroundColour(Colour(self.dlg.color_foreground))
121-
self._output.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
122-
self._log = log
123-
self._notebook = notebook
124-
self._add_to_notebook(notebook)
125-
self.SetFont(widgets.Font().fixed_log)
126-
self.Bind(wx.EVT_SIZE, self.OnSize)
127-
128-
def _add_to_notebook(self, notebook):
129-
notebook.add_tab(self, 'Parser Log', allow_closing=True)
130-
self._output.SetSize(self.Size)
131-
132-
def close(self, notebook):
133-
notebook.delete_tab(self)
134-
135-
def _create_ui(self):
136-
self.SetSizer(widgets.VerticalSizer())
137-
self.Sizer.add_expanding(self._output)
138-
139-
def update_log(self):
140-
self._output.SetValue(self._decode_log(self._log))
141-
142-
def _decode_log(self, log):
143-
result = ''
144-
for msg in log:
145-
result += _message_to_string(msg)
146-
return result
147-
148-
def OnSize(self, evt):
149-
self._output.SetSize(self.Size)
150-
151-
def OnKeyDown(self, event):
152-
keycode = event.GetKeyCode()
153-
154-
if event.ControlDown() and keycode == ord('A'):
155-
self.SelectAll()
156-
else:
157-
event.Skip()
158-
159-
def Copy(self):
160-
pass
161-
162-
def SelectAll(self):
163-
self._output.SetSelection(-1, -1)

0 commit comments

Comments
 (0)