Skip to content

Commit

Permalink
Vendor py events (#1057)
Browse files Browse the repository at this point in the history
Closes #1056
  • Loading branch information
jw3 authored Dec 27, 2024
1 parent e75af10 commit 1cdec16
Show file tree
Hide file tree
Showing 16 changed files with 169 additions and 20 deletions.
1 change: 0 additions & 1 deletion Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ wheel = "*"
[packages]
pycairo = "1.20.0"
PyGObject = "3.38.0"
events = "0.4"
argparse = "1.4.0"
rx = "~=3.2"
more-itertools = "~=7.2"
Expand Down
9 changes: 1 addition & 8 deletions Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion fapolicy-analyzer.spec
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ Summary: File Access Policy Analyzer GUI

Requires: python3
Requires: python3-gobject
Requires: python3-events
Requires: python3-configargparse
Requires: python3-more-itertools
Requires: python3-rx
Expand Down
25 changes: 25 additions & 0 deletions fapolicy_analyzer/events/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Copyright (c) 2017 by Nicola Iarocci and contributors.
# Copyright Concurrent Technologies Corporation 2024
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.

# -*- coding: utf-8 -*-
from .events import Events, EventsException

__version__ = '0.4'

__all__ = [
Events.__name__,
EventsException.__name__,
]
133 changes: 133 additions & 0 deletions fapolicy_analyzer/events/events.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
# Copyright (c) 2017 by Nicola Iarocci and contributors.
# Copyright Concurrent Technologies Corporation 2024
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.

# -*- coding: utf-8 -*-

"""
Events
~~~~~~
Implements C#-Style Events.
Derived from the original work by Zoran Isailovski:
http://code.activestate.com/recipes/410686/ - Copyright (c) 2005
:copyright: (c) 2014-2017 by Nicola Iarocci.
:license: BSD, see LICENSE for more details.
"""


class _EventSlot:
def __init__(self, name):
self.targets = []
self.__name__ = name

def __repr__(self):
return "event '%s'" % self.__name__

def __call__(self, *a, **kw):
for f in tuple(self.targets):
f(*a, **kw)

def __iadd__(self, f):
self.targets.append(f)
return self

def __isub__(self, f):
while f in self.targets:
self.targets.remove(f)
return self

def __len__(self):
return len(self.targets)

def __iter__(self):
def gen():
for target in self.targets:
yield target
return gen()

def __getitem__(self, key):
return self.targets[key]


class EventsException(Exception):
pass


class Events:
"""
Encapsulates the core to event subscription and event firing, and feels
like a "natural" part of the language.
The class Events is there mainly for 3 reasons:
- Events (Slots) are added automatically, so there is no need to
declare/create them separately. This is great for prototyping. (Note
that `__events__` is optional and should primarilly help detect
misspelled event names.)
- To provide (and encapsulate) some level of introspection.
- To "steel the name" and hereby remove unneeded redundancy in a call
like:
xxx.OnChange = event('OnChange')
"""
def __init__(self, events=None, event_slot_cls=_EventSlot):
self.__event_slot_cls__ = event_slot_cls

if events is not None:

try:
for _ in events:
break
except:
raise AttributeError("type object %s is not iterable" %
(type(events)))
else:
self.__events__ = events

def __getattr__(self, name):
if name.startswith('__'):
raise AttributeError("type object '%s' has no attribute '%s'" %
(self.__class__.__name__, name))

if hasattr(self, '__events__'):
if name not in self.__events__:
raise EventsException("Event '%s' is not declared" % name)

elif hasattr(self.__class__, '__events__'):
if name not in self.__class__.__events__:
raise EventsException("Event '%s' is not declared" % name)

self.__dict__[name] = ev = self.__event_slot_cls__(name)
return ev

def __repr__(self):
return '<%s.%s object at %s>' % (self.__class__.__module__,
self.__class__.__name__,
hex(id(self)))

__str__ = __repr__

def __len__(self):
return len(list(self.__iter__()))

def __iter__(self):
def gen(dictitems=self.__dict__.items()):
for attr, val in dictitems:
if isinstance(val, self.__event_slot_cls__):
yield val
return gen()
2 changes: 1 addition & 1 deletion fapolicy_analyzer/ui/add_file_button.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from os import path

import gi
from events import Events
from fapolicy_analyzer.events import Events

from fapolicy_analyzer.ui import strings
from fapolicy_analyzer.ui.file_chooser_dialog import FileChooserDialog
Expand Down
2 changes: 1 addition & 1 deletion fapolicy_analyzer/ui/editable_text_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
except ImportError:
import importlib_resources as resources

from events import Events
from fapolicy_analyzer.events import Events
from fapolicy_analyzer.ui.ui_widget import UIBuilderWidget

gi.require_version("GtkSource", "3.0")
Expand Down
2 changes: 1 addition & 1 deletion fapolicy_analyzer/ui/object_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.

import gi
from events import Events
from fapolicy_analyzer.events import Events

from fapolicy_analyzer.ui.strings import (
FILE_LIST_RULE_ID_HEADER,
Expand Down
2 changes: 1 addition & 1 deletion fapolicy_analyzer/ui/policy_rules_admin_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from typing import Optional, Sequence

import gi
from events import Events
from fapolicy_analyzer.events import Events

from fapolicy_analyzer import EventLog, Group, Trust, User
from fapolicy_analyzer.ui.acl_list import ACLList
Expand Down
2 changes: 1 addition & 1 deletion fapolicy_analyzer/ui/profiler_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import fapolicy_analyzer.ui.strings as s

import gi
from events import Events
from fapolicy_analyzer.events import Events
from fapolicy_analyzer.ui.actions import (
clear_profiler_state,
start_profiling,
Expand Down
2 changes: 1 addition & 1 deletion fapolicy_analyzer/ui/rules/rules_admin_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import logging
from typing import Any, Optional, Sequence, Tuple

from events import Events
from fapolicy_analyzer.events import Events

from fapolicy_analyzer import Rule, System, reload_profiler_rules
from fapolicy_analyzer.ui.actions import (
Expand Down
2 changes: 1 addition & 1 deletion fapolicy_analyzer/ui/searchable_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
from fapolicy_analyzer.ui.strings import FILTERING_DISABLED_DURING_LOADING_MESSAGE

gi.require_version("Gtk", "3.0")
from events import Events
from fapolicy_analyzer.events import Events
from gi.repository import Gtk

from fapolicy_analyzer.ui.loader import Loader
Expand Down
2 changes: 1 addition & 1 deletion fapolicy_analyzer/ui/stats/stats_view_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@


import gi
from events import Events
from fapolicy_analyzer.events import Events
from fapolicy_analyzer.ui.reducers.stats_reducer import StatsStreamState

from fapolicy_analyzer.ui.actions import (
Expand Down
2 changes: 1 addition & 1 deletion fapolicy_analyzer/ui/system_trust_database_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import logging
from locale import gettext as _

from events import Events
from fapolicy_analyzer.events import Events

import fapolicy_analyzer.ui.strings as strings
from fapolicy_analyzer.ui.actions import (
Expand Down
1 change: 0 additions & 1 deletion scripts/srpm/fapolicy-analyzer.el9.spec
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,6 @@ Summary: File Access Policy Analyzer GUI

Requires: python3
Requires: python3-gobject
Requires: python3-events
Requires: python3-configargparse
Requires: python3-more-itertools
Requires: python3-rx
Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ def get_features():
include=[
"fapolicy_analyzer",
"fapolicy_analyzer.css",
"fapolicy_analyzer.events*",
"fapolicy_analyzer.glade",
"fapolicy_analayzer.locale*",
"fapolicy_analyzer.redux*",
Expand Down

0 comments on commit 1cdec16

Please sign in to comment.