Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
3504599
Fixed Cut (Ctrl-X) in cell content edit in Grid Editor
HelioGuilherme66 Oct 9, 2025
2f37b3f
Fix size of folders tree in File Explorer
HelioGuilherme66 Dec 3, 2025
98083b9
Updates translations (#2995)
HelioGuilherme66 Dec 3, 2025
63fe386
Version 2.2.1.1 with fix in File Explorer
HelioGuilherme66 Dec 8, 2025
ccfb09e
Improvement to open binary files on their registered apps from File E…
HelioGuilherme66 Dec 13, 2025
5e92117
Set requests version to >= 2.6.0
HelioGuilherme66 Dec 21, 2025
ae1283c
Correct dependencies versions
HelioGuilherme66 Dec 22, 2025
9176bfb
Improve unit tests
HelioGuilherme66 Dec 23, 2025
c55bdf2
Fix unit tests
HelioGuilherme66 Jan 7, 2026
ee3027f
Development version 2.2.3dev1
HelioGuilherme66 Jan 8, 2026
f024a97
add options to not break lines in translations files
HelioGuilherme66 Jan 10, 2026
03404bd
Merge branch 'master' into develop
HelioGuilherme66 Jan 10, 2026
c2ee529
Set Changelog to develop
HelioGuilherme66 Jan 10, 2026
5338391
Add isbinary as a library.
HelioGuilherme66 Jan 10, 2026
437808e
Fix two unit tests. WIP
HelioGuilherme66 Jan 11, 2026
4f04c8d
Update translations
HelioGuilherme66 Jan 11, 2026
a1f5177
Fix unit tests
HelioGuilherme66 Jan 11, 2026
3e4de3f
Fix menu positions in translations th and vi
HelioGuilherme66 Jan 11, 2026
2e3cb67
Remove isbinary from package configuration
HelioGuilherme66 Jan 11, 2026
450caf1
Add chardet package configuration
HelioGuilherme66 Jan 11, 2026
e33d5ed
Fix tabs in th translation
HelioGuilherme66 Jan 11, 2026
582a45f
Del shortcut in th translation
HelioGuilherme66 Jan 12, 2026
d13158d
Merge branch 'master' into develop
HelioGuilherme66 Mar 4, 2026
2d1ae90
Modernize print calls to use f-strings (#3011)
chelslava Mar 28, 2026
eedf25c
Fix AttributeError: 'Project' object has no attribute 'datafile_contr…
chelslava Mar 28, 2026
9abf0c5
Fix 'General' settings not available after upgrade (blocks startup) (…
chelslava Mar 29, 2026
dce6bb4
Add periodic auto-save feature
chelslava Mar 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@ All notable changes to this project will be documented in this file.
The format is based on http://keepachangelog.com/en/1.0.0/[Keep a Changelog]
and this project adheres to http://semver.org/spec/v2.0.0.html[Semantic Versioning].

// == https://github.com/robotframework/RIDE[Unreleased]
== https://github.com/robotframework/RIDE[Unreleased]

=== Changed
- Changed isbinary to be internal library, instead of being dependency.


== https://github.com/robotframework/RIDE/blob/master/doc/releasenotes/ride-2.2.2.rst[2.2.2] - 2026-01-06

Expand Down
2 changes: 1 addition & 1 deletion README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ Likewise, the current version of wxPython, is 4.2.4, but RIDE is known to work w

`pip install -U robotframework-ride`

(3.9 <= python <= 3.14) Install current development version (**2.2.2**) with:
(3.9 <= python <= 3.14) Install current development version (**2.2.3dev3**) with:

`pip install -U https://github.com/robotframework/RIDE/archive/develop.zip`

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ classifiers = [
"Topic :: Software Development :: Testing",
]
dependencies = [
"isbinary",
"chardet",
"psutil",
"Pygments",
"PyPubSub",
Expand Down
1 change: 1 addition & 0 deletions requirements-dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ pytest-html
pytest-order
packaging >= 24.2
hatch-fancy-pypi-readme
hypothesis # dependency for isbinary unit tests
# To make a relase you need asciidoc3 (a2x3)
# asciidoc3
# Include also normal project requirements.
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Pywin32; sys_platform == 'win32'
Pygments # This enables syntax highlighted in Text Editor
robotframework
Pypubsub
isbinary
psutil
packaging
chardet
requests>=2.32.4
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
SOURCE_DIR = 'src'
REQUIREMENTS = ['PyPubSub',
'Pygments',
'chardet',
'psutil',
'Pywin32; sys_platform=="win32"',
'wxPython',
Expand Down
4 changes: 2 additions & 2 deletions src/robotide/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@

errorMessageTemplate = Template("""$reason
RIDE depends on wx (wxPython). Known versions for Python3 are: 4.0.7.post2, 4.1.1 and 4.2.1.\
At the time of this release the current wxPython version is 4.2.3.\
At the time of this release the current wxPython version is 4.2.4.\
You can install with 'pip install wxPython' on most operating systems, or find the \
the download link from https://wxPython.org/""")

Expand Down Expand Up @@ -154,7 +154,7 @@ def _show_old_wxpython_warning_if_needed(parent=None):
message = ("RIDE needs a newer wxPython version. Your current "
"version is %s."
"\n"
"At the time of this release the current wxPython version is 4.2.3. See "
"At the time of this release the current wxPython version is 4.2.4. See "
"https://wxPython.org/ for downloads and instructions."
% wx.VERSION_STRING)
style = wx.ICON_EXCLAMATION
Expand Down
142 changes: 72 additions & 70 deletions src/robotide/application/CHANGELOG.html

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions src/robotide/application/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,8 +147,9 @@ class Message:
self._controller = Project(self.namespace, self.settings)
# print(f"DEBUG: application.py RIDE OnInit after defining controller= {self._controller}")
# Try to get FontInfo as soon as possible
font_size = self.settings['General'].get('font size', 12)
font_face = self.settings['General'].get('font face', 'Helvetica')
general = self.settings.get('General', {})
font_size = general.get('font size', 12) if general else 12
font_face = general.get('font face', 'Helvetica') if general else 'Helvetica'
self.fontinfo = wx.FontInfo(font_size).FaceName(font_face).Bold(False)
self.fileexplorerplugin = FileExplorerPlugin(self, self._controller)
self.frame = RideFrame(self, self._controller)
Expand Down
2 changes: 1 addition & 1 deletion src/robotide/application/releasenotes.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ def set_content(self, html_win, content):
<pre class="literal-block">python -m robotide.postinstall -install</pre>
<p>or</p>
<pre class="literal-block">ride_postinstall.py -install</pre>
<p>RIDE {VERSION} was released on 07/January/2026.</p>
<p>RIDE {VERSION} was released on 11/January/2026.</p>
<br/>
<!--
<h3>Celebrate the bank holiday, 1st December, Restoration of the Independence of Portugal (from Spain in 1640)!!</h3>
Expand Down
4 changes: 4 additions & 0 deletions src/robotide/controller/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,10 @@ def data(self):
def suite(self):
return self.controller.data if self.controller else None

@property
def datafile_controller(self):
return self.controller

@property
def datafiles(self):
return self._suites() + self.resources
Expand Down
8 changes: 5 additions & 3 deletions src/robotide/controller/tablecontrollers.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
from ..robotapi import is_list_var, is_scalar_var, is_dict_var
from ..utils import variablematcher
from .basecontroller import ControllerWithParent
from . import macrocontrollers # TestCaseController, UserKeywordController
# from . import macrocontrollers # TestCaseController, UserKeywordController
from .settingcontrollers import MetadataController, import_controller, VariableController


Expand Down Expand Up @@ -317,9 +317,10 @@ def _configure_controller(self, ctrl, config):


class TestCaseTableController(_MacroTable):
from .macrocontrollers import TestCaseController
__test__ = False
item_type = 'Test case'
_controller_class = macrocontrollers.TestCaseController
_controller_class = TestCaseController

@property
def items(self):
Expand Down Expand Up @@ -350,8 +351,9 @@ def restore_test_order(self, rlist):


class KeywordTableController(_MacroTable):
from .macrocontrollers import UserKeywordController
item_type = 'User keyword'
_controller_class = macrocontrollers.UserKeywordController
_controller_class = UserKeywordController

@property
def items(self):
Expand Down
3 changes: 2 additions & 1 deletion src/robotide/editor/gridcolorizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import wx

from ..controller.cellinfo import CellType, ContentType
from ..controller.macrocontrollers import UserKeywordController
# from ..controller.macrocontrollers import UserKeywordController


# this import fails in HUDSON
Expand Down Expand Up @@ -58,6 +58,7 @@ def _coloring_task(self, task_index, selection_content, row=0, col=0):
self._coloring_task(task_index, selection_content, row+1, 0)

def _colorize_cell(self, row, col, selection_content):
from ..controller.macrocontrollers import UserKeywordController
cell_info = self._controller.get_cell_info(row, col)
if cell_info is None:
self._set_default_colors(row, col)
Expand Down
29 changes: 29 additions & 0 deletions src/robotide/lib/isbinary/LICENSE.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
BSD 3-Clause License

Copyright (c) 2013, Audrey Roy
Copyright (c) 2022, Matthew Gamble

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
90 changes: 90 additions & 0 deletions src/robotide/lib/isbinary/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
=======================================================================================
These files were copied and adapted from https://github.com/djmattyg007/python-isbinary
=======================================================================================

-----

========
isbinary
========

.. image:: https://github.com/djmattyg007/python-isbinary/workflows/CI/badge.svg?branch=main
:target: https://github.com/djmattyg007/freiner/actions?query=branch%3Amain+workflow%3ACI
:alt: CI

.. image:: https://codecov.io/gh/djmattyg007/python-isbinary/branch/main/graph/badge.svg
:target: https://codecov.io/gh/djmattyg007/python-isbinary
:alt: Coverage

.. image:: https://img.shields.io/pypi/v/isbinary.svg
:target: https://pypi.org/pypi/isbinary
:alt: PyPI

.. image:: https://img.shields.io/pypi/l/isbinary.svg
:target: https://pypi.org/project/isbinary
:alt: BSD License

.. image:: https://readthedocs.org/projects/isbinary/badge/?version=latest
:target: https://isbinary.readthedocs.io/en/latest/?badge=latest
:alt: Documentation Status

Lightweight pure Python package to guess whether a file is binary or text,
using a heuristic similar to Perl's `pp_fttext` and its analysis by @eliben.

* Free software: BSD license
* Documentation: https://isbinary.readthedocs.io/

Status
------

It works, and people are using this package in various places. But it doesn't cover all edge cases yet.

The code could be improved. Pull requests welcome! As of now, it is based on these snippets, but that may change:

* https://stackoverflow.com/questions/898669/how-can-i-detect-if-a-file-is-binary-non-text-in-python
* https://stackoverflow.com/questions/1446549/how-to-identify-binary-and-text-files-using-python
* https://code.activestate.com/recipes/173220/
* https://eli.thegreenplace.net/2011/10/19/perls-guess-if-file-is-text-or-binary-implemented-in-python/

Features
--------

Has tests for these file types:

* Text: .txt, .css, .json, .svg, .js, .lua, .pl, .rst
* Binary: .png, .gif, .jpg, .tiff, .bmp, .DS_Store, .eot, .otf, .ttf, .woff, .rgb

Has tests for numerous encodings.

Why?
----

You may be thinking, "I can write this in 2 lines of code?!"

It's actually not that easy. Here's a great article about how Perl's
heuristic to guess file types works: https://eli.thegreenplace.net/2011/10/19/perls-guess-if-file-is-text-or-binary-implemented-in-python/

And that's just where we started. Over time, we've found more edge cases and
our heuristic has gotten more complex.

Also, this package saves you from having to write and thoroughly test
your code with all sorts of weird file types and encodings, cross-platform.

History
-------

This is a long-term fork of `binaryornot <https://github.com/audreyfeldroy/binaryornot>`_. It was created in
May 2022 primarily because it appeared that upstream had been abandoned. There were a few other smaller issues:

1. Lack of type annotations.
2. Lack of stricter modern code quality tools used in CI.
3. Improved contributor experience by using Github Actions for CI.
4. Possibility for optimisation with optional dependency on `cchardet`.
5. Removal of Python 2 support, and explicit support for newer versions of Python 3.

Credits
-------

* Audrey and Danny Roy Greenfeld, as the previous maintainers of this code.
* Special thanks to Eli Bendersky (@eliben) for his writeup explaining the heuristic and his implementation, which this is largely based on.
* Source code from the portion of Perl's `pp_fttext` that checks for textiness: https://github.com/Perl/perl5/blob/v5.23.1/pp_sys.c#L3527-L3587
25 changes: 25 additions & 0 deletions src/robotide/lib/isbinary/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

from .check import (
BinaryLikeliness,
get_starting_chunk,
has_null_bytes,
is_binary_file,
is_binary_string,
is_decodable_as_unicode,
is_likely_binary,
)


__version__ = "1.0.1"


__all__ = (
"get_starting_chunk",
"BinaryLikeliness",
"is_likely_binary",
"is_decodable_as_unicode",
"has_null_bytes",
"is_binary_string",
"is_binary_file",
"__version__",
)
5 changes: 5 additions & 0 deletions src/robotide/lib/isbinary/__main__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@

from .cli import main


main()
26 changes: 26 additions & 0 deletions src/robotide/lib/isbinary/_chardet.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@

from typing import Callable, TypedDict, cast


class DetectResult(TypedDict):
encoding: str
confidence: float
language: str


Detect = Callable[[bytes], DetectResult]


def _get_chardet_detect() -> Detect:
try:
detect = __import__("cchardet").detect
except ImportError:
detect = __import__("chardet").detect

return cast(Detect, detect)


chardet_detect = _get_chardet_detect()


__all__ = ("DetectResult", "chardet_detect")
Loading
Loading