openSUSE Commits
Threads by month
- ----- 2025 -----
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
May 2019
- 1 participants
- 2232 discussions
Hello community,
here is the log from the commit of package gpxsee for openSUSE:Factory checked in at 2019-05-15 12:35:01
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gpxsee (Old)
and /work/SRC/openSUSE:Factory/.gpxsee.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gpxsee"
Wed May 15 12:35:01 2019 rev:43 rq:703001 version:7.6
Changes:
--------
--- /work/SRC/openSUSE:Factory/gpxsee/gpxsee.changes 2019-03-19 10:02:57.699804078 +0100
+++ /work/SRC/openSUSE:Factory/.gpxsee.new.5148/gpxsee.changes 2019-05-15 12:35:01.612428375 +0200
@@ -1,0 +2,9 @@
+Sun May 12 17:55:57 CEST 2019 - tumic(a)cbox.cz
+
+- Update to version 7.6
+ * Added support for Garmin IMG maps.
+ * Fixed coordinates info display issues.
+ * Fixed rendering of large areas using OpenGL.
+ * Fixed broken speed type switch.
+
+-------------------------------------------------------------------
Old:
----
GPXSee-7.5.tar.gz
New:
----
GPXSee-7.6.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ gpxsee.spec ++++++
--- /var/tmp/diff_new_pack.C8RS4O/_old 2019-05-15 12:35:02.336426457 +0200
+++ /var/tmp/diff_new_pack.C8RS4O/_new 2019-05-15 12:35:02.340426445 +0200
@@ -19,7 +19,7 @@
# See also http://en.opensuse.org/openSUSE:Specfile_guidelines
Name: gpxsee
-Version: 7.5
+Version: 7.6
Release: 1
Summary: GPS log file visualization and analysis tool
License: GPL-3.0-only
@@ -78,7 +78,7 @@
%{qmake5} gpxsee.pro
%else
lrelease-qt4 gpxsee.pro
-qmake-qt4 gpxsee.pro
+qmake-qt4 PREFIX=/usr gpxsee.pro
%endif
%endif
make %{?_smp_mflags}
++++++ GPXSee-7.5.tar.gz -> GPXSee-7.6.tar.gz ++++++
++++ 6791 lines of diff (skipped)
++++++ PKGBUILD ++++++
--- /var/tmp/diff_new_pack.C8RS4O/_old 2019-05-15 12:35:02.764425321 +0200
+++ /var/tmp/diff_new_pack.C8RS4O/_new 2019-05-15 12:35:02.764425321 +0200
@@ -1,5 +1,5 @@
pkgname=gpxsee
-pkgver=7.5
+pkgver=7.6
pkgrel=1
pkgdesc='GPS log files visualizing and analyzing tool'
arch=('i686' 'x86_64')
++++++ debian.changelog ++++++
--- /var/tmp/diff_new_pack.C8RS4O/_old 2019-05-15 12:35:02.792425247 +0200
+++ /var/tmp/diff_new_pack.C8RS4O/_new 2019-05-15 12:35:02.792425247 +0200
@@ -1,3 +1,12 @@
+gpxsee (7.6) stable; urgency=low
+
+ * Added support for Garmin IMG maps.
+ * Fixed coordinates info display issues.
+ * Fixed rendering of large areas using OpenGL.
+ * Fixed broken speed type switch.
+
+ -- Martin Tuma <tumic(a)cbox.cz> Sun, 12 May 2019 17:59:24 +0200
+
gpxsee (7.5) stable; urgency=low
* Added support for geotagged JPEG images.
++++++ gpxsee.dsc ++++++
--- /var/tmp/diff_new_pack.C8RS4O/_old 2019-05-15 12:35:02.884425004 +0200
+++ /var/tmp/diff_new_pack.C8RS4O/_new 2019-05-15 12:35:02.888424992 +0200
@@ -1,9 +1,9 @@
Format: 1.0
Source: gpxsee
-Version: 7.5
+Version: 7.6
Binary: gpxsee
Maintainer: Martin Tuma <tumic(a)cbox.cz>
Architecture: any
Build-Depends: debhelper (>= 9), qtbase5-dev, qtbase5-dev-tools, qt5-qmake, qttools5-dev-tools, libqt5opengl5-dev
Files:
- 00000000000000000000000000000000 0 GPXSee-7.5.tar.gz
+ 00000000000000000000000000000000 0 GPXSee-7.6.tar.gz
1
0
Hello community,
here is the log from the commit of package libtorrent-rasterbar for openSUSE:Factory checked in at 2019-05-15 12:34:55
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libtorrent-rasterbar (Old)
and /work/SRC/openSUSE:Factory/.libtorrent-rasterbar.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libtorrent-rasterbar"
Wed May 15 12:34:55 2019 rev:60 rq:702973 version:1.1.13
Changes:
--------
--- /work/SRC/openSUSE:Factory/libtorrent-rasterbar/libtorrent-rasterbar.changes 2019-01-28 20:50:43.269761146 +0100
+++ /work/SRC/openSUSE:Factory/.libtorrent-rasterbar.new.5148/libtorrent-rasterbar.changes 2019-05-15 12:34:58.456436743 +0200
@@ -1,0 +2,9 @@
+Tue May 14 18:32:35 UTC 2019 - Mariusz Fik <fisiu(a)opensuse.org>
+
+- Update to 1.1.13:
+ * fix sock_type_t python binding
+ * tighten up various input validation checks
+ * replace use of boost-endian with boost-predef, fix boo#1134615
+ * uTP performance fixes
+
+-------------------------------------------------------------------
Old:
----
libtorrent-rasterbar-1.1.11.tar.gz
New:
----
libtorrent-rasterbar-1.1.13.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ libtorrent-rasterbar.spec ++++++
--- /var/tmp/diff_new_pack.LIxLkg/_old 2019-05-15 12:35:00.188432151 +0200
+++ /var/tmp/diff_new_pack.LIxLkg/_new 2019-05-15 12:35:00.192432140 +0200
@@ -18,19 +18,19 @@
%define _name libtorrent
%define sover 9
-%define _version 1_1_11
+%define _version 1_1_13
%bcond_without python2
%bcond_without python3
%bcond_with examples
%bcond_with tests
Name: libtorrent-rasterbar
-Version: 1.1.11
+Version: 1.1.13
Release: 0
Summary: A C++ implementation of the BitTorrent protocol
License: BSD-3-Clause
Group: Development/Libraries/C and C++
URL: http://libtorrent.org/
-Source: https://github.com/arvidn/%{_name}/releases/download/%{_name}_%{_version}/%…
+Source: https://github.com/arvidn/%{_name}/releases/download/%{_name}-%{_version}/%…
BuildRequires: gcc-c++
BuildRequires: pkgconfig
BuildRequires: pkgconfig(openssl)
++++++ libtorrent-rasterbar-1.1.11.tar.gz -> libtorrent-rasterbar-1.1.13.tar.gz ++++++
++++ 32742 lines of diff (skipped)
1
0
Hello community,
here is the log from the commit of package python-forbiddenfruit for openSUSE:Factory checked in at 2019-05-15 12:34:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-forbiddenfruit (Old)
and /work/SRC/openSUSE:Factory/.python-forbiddenfruit.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-forbiddenfruit"
Wed May 15 12:34:49 2019 rev:3 rq:702963 version:0.1.3
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-forbiddenfruit/python-forbiddenfruit.changes 2019-03-19 09:59:07.692085233 +0100
+++ /work/SRC/openSUSE:Factory/.python-forbiddenfruit.new.5148/python-forbiddenfruit.changes 2019-05-15 12:34:53.620449564 +0200
@@ -1,0 +2,9 @@
+Fri May 10 08:48:55 UTC 2019 - pgajdos(a)suse.com
+
+- version update to 0.1.3
+ * no upstream changelog
+- added sources
+ https://github.com/clarete/forbiddenfruit/issues/30
+ + COPYING.GPL
+
+-------------------------------------------------------------------
Old:
----
0.1.2.tar.gz
New:
----
0.1.3.tar.gz
COPYING.GPL
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-forbiddenfruit.spec ++++++
--- /var/tmp/diff_new_pack.TNifR6/_old 2019-05-15 12:34:55.840443679 +0200
+++ /var/tmp/diff_new_pack.TNifR6/_new 2019-05-15 12:34:55.840443679 +0200
@@ -18,15 +18,17 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-forbiddenfruit
-Version: 0.1.2
+Version: 0.1.3
Release: 0
Summary: Python module to patch python built-in objects
-License: LGPL-3.0-or-later
+License: GPL-3.0-only OR MIT
Group: Development/Languages/Python
Url: https://github.com/clarete/forbiddenfruit
-Source: https://github.com/clarete/forbiddenfruit/archive/%{version}.tar.gz
+Source0: https://github.com/clarete/forbiddenfruit/archive/%{version}.tar.gz
+# https://github.com/clarete/forbiddenfruit/issues/30
+Source1: COPYING.GPL
BuildRequires: %{python_module devel}
-BuildRequires: %{python_module pytest}
+BuildRequires: %{python_module nose}
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
@@ -38,6 +40,7 @@
%prep
%setup -q -n forbiddenfruit-%{version}
+cp %{SOURCE1} .
%build
%python_build
@@ -47,11 +50,11 @@
%python_expand %fdupes %{buildroot}%{$python_sitearch}
%check
-# imports fail
-#%%python_expand PYTHONPATH=$PYTHONPATH:%{buildroot}%{$python_sitearch} py.test-%{$python_bin_suffix} -v
+%python_expand ln -s %{buildroot}%{$python_sitearch}/ffruit* tests/unit
+%python_expand nosetests-%{$python_bin_suffix}
%files %{python_files}
-%license COPYING
+%license COPYING.GPL COPYING.mit
%doc README.md
%{python_sitearch}/*
++++++ 0.1.2.tar.gz -> 0.1.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forbiddenfruit-0.1.2/.travis.yml new/forbiddenfruit-0.1.3/.travis.yml
--- old/forbiddenfruit-0.1.2/.travis.yml 2016-03-31 05:25:16.000000000 +0200
+++ new/forbiddenfruit-0.1.3/.travis.yml 2019-04-20 16:32:31.000000000 +0200
@@ -1,10 +1,11 @@
+dist: xenial
language: python
python:
- - 2.5
- - 2.6
- 2.7
- - 3.2
- - 3.3
+ - 3.4
+ - 3.5
+ - 3.6
+ - 3.7
script: make
install:
- pip install -r development.txt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forbiddenfruit-0.1.2/COPYING.mit new/forbiddenfruit-0.1.3/COPYING.mit
--- old/forbiddenfruit-0.1.2/COPYING.mit 1970-01-01 01:00:00.000000000 +0100
+++ new/forbiddenfruit-0.1.3/COPYING.mit 2019-04-20 16:32:31.000000000 +0200
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2013, 2019 Lincoln Clarete
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forbiddenfruit-0.1.2/MANIFEST.in new/forbiddenfruit-0.1.3/MANIFEST.in
--- old/forbiddenfruit-0.1.2/MANIFEST.in 2016-03-31 05:25:16.000000000 +0200
+++ new/forbiddenfruit-0.1.3/MANIFEST.in 2019-04-20 16:32:31.000000000 +0200
@@ -1,3 +1,4 @@
include README.md
include COPYING
include requirements.txt
+graft tests
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forbiddenfruit-0.1.2/Makefile new/forbiddenfruit-0.1.3/Makefile
--- old/forbiddenfruit-0.1.2/Makefile 2016-03-31 05:25:16.000000000 +0200
+++ new/forbiddenfruit-0.1.3/Makefile 2019-04-20 16:32:31.000000000 +0200
@@ -9,7 +9,7 @@
CUSTOM_PIP_INDEX=
# </variables>
-all: unit functional integration steadymark
+all: unit functional integration
unit:
@make run_test suite=unit
@@ -28,9 +28,6 @@
--cover-branches --verbosity=2 -s tests/$(suite) ; \
fi
-steadymark:
- @hash steadymark &> /dev/null && steadymark; echo # This echo tells the shell that everything worked :P
-
prepare: clean install_deps build_test_stub
install_deps:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forbiddenfruit-0.1.2/README.md new/forbiddenfruit-0.1.3/README.md
--- old/forbiddenfruit-0.1.2/README.md 2016-03-31 05:25:16.000000000 +0200
+++ new/forbiddenfruit-0.1.3/README.md 2019-04-20 16:32:31.000000000 +0200
@@ -75,8 +75,3 @@
### Logo by
Kimberly Chandler, from The Noun Project
-
-
-
-[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/clarete/forbiddenfruit/trend.p… "Bitdeli Badge")
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forbiddenfruit-0.1.2/forbiddenfruit/__init__.py new/forbiddenfruit-0.1.3/forbiddenfruit/__init__.py
--- old/forbiddenfruit-0.1.2/forbiddenfruit/__init__.py 2016-03-31 05:25:16.000000000 +0200
+++ new/forbiddenfruit-0.1.3/forbiddenfruit/__init__.py 2019-04-20 16:32:31.000000000 +0200
@@ -1,3 +1,47 @@
+# forbiddenfruit - Patch built-in python objects
+#
+# Copyright (c) 2013,2019 Lincoln de Sousa <lincoln(a)clarete.li>
+#
+# This program is dual licensed under GPLv3 and MIT.
+#
+# GPLv3
+# -----
+# 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 <http://www.gnu.org/licenses/>.
+#
+# MIT
+# ---
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import sys
+from types import FunctionType
import ctypes
import inspect
from functools import wraps
@@ -9,43 +53,180 @@
# Python 3 support
import builtins as __builtin__
-__version__ = '0.1.2'
+__version__ = '0.1.3'
__all__ = 'curse', 'curses', 'reverse'
-Py_ssize_t = \
- hasattr(ctypes.pythonapi, 'Py_InitModule4_64') \
- and ctypes.c_int64 or ctypes.c_int
+Py_ssize_t = ctypes.c_int64 if ctypes.sizeof(ctypes.c_void_p) == 8 else ctypes.c_int32
+
+
+# dictionary holding references to the allocated function resolution
+# arrays to type objects
+tp_as_dict = {}
+# container to cfunc callbacks
+tp_func_dict = {}
class PyObject(ctypes.Structure):
+ def incref(self):
+ self.ob_refcnt += 1
+
+ def decref(self):
+ self.ob_refcnt -= 1
+
+class PyFile(ctypes.Structure):
+ pass
+
+PyObject_p = ctypes.py_object
+Inquiry_p = ctypes.CFUNCTYPE(ctypes.c_int, PyObject_p)
+# return type is void* to allow ctypes to convert python integers to
+# plain PyObject*
+UnaryFunc_p = ctypes.CFUNCTYPE(ctypes.py_object, PyObject_p)
+BinaryFunc_p = ctypes.CFUNCTYPE(ctypes.py_object, PyObject_p, PyObject_p)
+TernaryFunc_p = ctypes.CFUNCTYPE(ctypes.py_object, PyObject_p, PyObject_p, PyObject_p)
+LenFunc_p = ctypes.CFUNCTYPE(Py_ssize_t, PyObject_p)
+SSizeArgFunc_p = ctypes.CFUNCTYPE(ctypes.py_object, PyObject_p, Py_ssize_t)
+SSizeObjArgProc_p = ctypes.CFUNCTYPE(ctypes.c_int, PyObject_p, Py_ssize_t, PyObject_p)
+ObjObjProc_p = ctypes.CFUNCTYPE(ctypes.c_int, PyObject_p, PyObject_p)
+
+FILE_p = ctypes.POINTER(PyFile)
+
+
+def get_not_implemented():
+ namespace = {}
+ name = "_Py_NotImplmented"
+ not_implemented = ctypes.cast(
+ ctypes.pythonapi._Py_NotImplementedStruct, ctypes.py_object)
+
+ ctypes.pythonapi.PyDict_SetItem(
+ ctypes.py_object(namespace),
+ ctypes.py_object(name),
+ not_implemented
+ )
+ return namespace[name]
+
+
+# address of the _Py_NotImplementedStruct singleton
+NotImplementedRet = get_not_implemented()
+
+class PyNumberMethods(ctypes.Structure):
+ _fields_ = [
+ ('nb_add', BinaryFunc_p),
+ ('nb_subtract', BinaryFunc_p),
+ ('nb_multiply', BinaryFunc_p),
+ ('nb_remainder', BinaryFunc_p),
+ ('nb_divmod', BinaryFunc_p),
+ ('nb_power', BinaryFunc_p),
+ ('nb_negative', UnaryFunc_p),
+ ('nb_positive', UnaryFunc_p),
+ ('nb_absolute', UnaryFunc_p),
+ ('nb_bool', Inquiry_p),
+ ('nb_invert', UnaryFunc_p),
+ ('nb_lshift', BinaryFunc_p),
+ ('nb_rshift', BinaryFunc_p),
+ ('nb_and', BinaryFunc_p),
+ ('nb_xor', BinaryFunc_p),
+ ('nb_or', BinaryFunc_p),
+ ('nb_int', UnaryFunc_p),
+ ('nb_reserved', ctypes.c_void_p),
+ ('nb_float', UnaryFunc_p),
+
+ ('nb_inplace_add', BinaryFunc_p),
+ ('nb_inplace_subtract', BinaryFunc_p),
+ ('nb_inplace_multiply', BinaryFunc_p),
+ ('nb_inplace_remainder', BinaryFunc_p),
+ ('nb_inplace_power', TernaryFunc_p),
+ ('nb_inplace_lshift', BinaryFunc_p),
+ ('nb_inplace_rshift', BinaryFunc_p),
+ ('nb_inplace_and', BinaryFunc_p),
+ ('nb_inplace_xor', BinaryFunc_p),
+ ('nb_inplace_or', BinaryFunc_p),
+
+ ('nb_floor_divide', BinaryFunc_p),
+ ('nb_true_divide', BinaryFunc_p),
+ ('nb_inplace_floor_divide', BinaryFunc_p),
+ ('nb_inplace_true_divide', BinaryFunc_p),
+
+ ('nb_index', BinaryFunc_p),
+
+ ('nb_matrix_multiply', BinaryFunc_p),
+ ('nb_inplace_matrix_multiply', BinaryFunc_p),
+ ]
+
+class PySequenceMethods(ctypes.Structure):
+ _fields_ = [
+ ('sq_length', LenFunc_p),
+ ('sq_concat', BinaryFunc_p),
+ ('sq_repeat', SSizeArgFunc_p),
+ ('sq_item', SSizeArgFunc_p),
+ ('was_sq_slice', ctypes.c_void_p),
+ ('sq_ass_item', SSizeObjArgProc_p),
+ ('was_sq_ass_slice', ctypes.c_void_p),
+ ('sq_contains', ObjObjProc_p),
+ ('sq_inplace_concat', BinaryFunc_p),
+ ('sq_inplace_repeat', SSizeArgFunc_p),
+ ]
+
+class PyMappingMethods(ctypes.Structure):
+ pass
+
+class PyTypeObject(ctypes.Structure):
+ pass
+
+class PyAsyncMethods(ctypes.Structure):
pass
+
PyObject._fields_ = [
('ob_refcnt', Py_ssize_t),
- ('ob_type', ctypes.POINTER(PyObject)),
+ ('ob_type', ctypes.POINTER(PyTypeObject)),
+]
+
+PyTypeObject._fields_ = [
+ # varhead
+ ('ob_base', PyObject),
+ ('ob_size', Py_ssize_t),
+ # declaration
+ ('tp_name', ctypes.c_char_p),
+ ('tp_basicsize', Py_ssize_t),
+ ('tp_itemsize', Py_ssize_t),
+ ('tp_dealloc', ctypes.CFUNCTYPE(None, PyObject_p)),
+ ('printfunc', ctypes.CFUNCTYPE(ctypes.c_int, PyObject_p, FILE_p, ctypes.c_int)),
+ ('getattrfunc', ctypes.CFUNCTYPE(PyObject_p, PyObject_p, ctypes.c_char_p)),
+ ('setattrfunc', ctypes.CFUNCTYPE(ctypes.c_int, PyObject_p, ctypes.c_char_p, PyObject_p)),
+ ('tp_as_async', ctypes.CFUNCTYPE(PyAsyncMethods)),
+ ('tp_repr', ctypes.CFUNCTYPE(PyObject_p, PyObject_p)),
+ ('tp_as_number', ctypes.POINTER(PyNumberMethods)),
+ ('tp_as_sequence', ctypes.POINTER(PySequenceMethods)),
+ ('tp_as_mapping', ctypes.POINTER(PyMappingMethods)),
+ # ...
]
+# redundant dict of pointee types, because ctypes doesn't allow us
+# to extract the pointee type from the pointer
+PyTypeObject_as_types_dict = {
+ 'tp_as_async': PyAsyncMethods,
+ 'tp_as_number': PyNumberMethods,
+ 'tp_as_sequence': PySequenceMethods,
+ 'tp_as_mapping': PyMappingMethods,
+}
+
+
class SlotsProxy(PyObject):
_fields_ = [('dict', ctypes.POINTER(PyObject))]
def patchable_builtin(klass):
- # It's important to create variables here, we want those objects alive
- # within this whole scope.
name = klass.__name__
target = klass.__dict__
- # Hardcore introspection to find the `PyProxyDict` object that contains the
- # precious `dict` attribute.
proxy_dict = SlotsProxy.from_address(id(target))
namespace = {}
- # This is the way I found to `cast` this `proxy_dict.dict` into a python
- # object, cause the `from_address()` function returns the `py_object`
- # version
+ # This code casts `proxy_dict.dict` into a python object and
+ # `from_address()` returns `py_object`
ctypes.pythonapi.PyDict_SetItem(
ctypes.py_object(namespace),
ctypes.py_object(name),
@@ -58,8 +239,8 @@
def __filtered_dir__(obj=None):
name = hasattr(obj, '__name__') and obj.__name__ or obj.__class__.__name__
if obj is None:
- # Return names from the local scope of the calling frame, taking into
- # account indirection added by __filtered_dir__
+ # Return names from the local scope of the calling frame,
+ # taking into account indirection added by __filtered_dir__
calling_frame = inspect.currentframe().f_back
return sorted(calling_frame.f_locals.keys())
return sorted(set(__dir__(obj)).difference(__hidden_elements__[name]))
@@ -69,6 +250,137 @@
__dir__ = dir
__builtin__.dir = __filtered_dir__
+# build override infomation for dunder methods
+as_number = ('tp_as_number', [
+ ("add", "nb_add"),
+ ("sub", "nb_subtract"),
+ ("mul", "nb_multiply"),
+ ("mod", "nb_remainder"),
+ ("pow", "nb_power"),
+ ("neg", "nb_negative"),
+ ("pos", "nb_positive"),
+ ("abs", "nb_absolute"),
+ ("bool", "nb_bool"),
+ ("inv", "nb_invert"),
+ ("lshift", "nb_lshift"),
+ ("rshift", "nb_rshift"),
+ ("and", "nb_and"),
+ ("xor", "nb_xor"),
+ ("or", "nb_or"),
+ ("int", "nb_int"),
+ ("float", "nb_float"),
+ ("iadd", "nb_inplace_add"),
+ ("isub", "nb_inplace_subtract"),
+ ("imul", "nb_inplace_multiply"),
+ ("imod", "nb_inplace_remainder"),
+ ("ipow", "nb_inplace_power"),
+ ("ilshift", "nb_inplace_lshift"),
+ ("irshift", "nb_inplace_rshift"),
+ ("iadd", "nb_inplace_and"),
+ ("ixor", "nb_inplace_xor"),
+ ("ior", "nb_inplace_or"),
+ ("floordiv", "nb_floor_divide"),
+ ("div", "nb_true_divide"),
+ ("ifloordiv", "nb_inplace_floor_divide"),
+ ("idiv", "nb_inplace_true_divide"),
+ ("index", "nb_index"),
+ ("matmul", "nb_matrix_multiply"),
+ ("imatmul", "nb_inplace_matrix_multiply"),
+])
+
+as_sequence = ("tp_as_sequence", [
+ ("len", "sq_length"),
+ ("concat", "sq_concat"),
+ ("repeat", "sq_repeat"),
+ ("getitem", "sq_item"),
+ ("setitem", "sq_ass_item"),
+ ("contains", "sq_contains"),
+ ("iconcat", "sq_inplace_concat"),
+ ("irepeat", "sq_inplace_repeat"),
+])
+
+as_async = ("tp_as_async", [
+ ("await", "am_await"),
+ ("aiter", "am_aiter"),
+ ("anext", "am_anext"),
+])
+
+override_dict = {}
+for override in [as_number, as_sequence, as_async]:
+ tp_as_name = override[0]
+ for dunder, impl_method in override[1]:
+ override_dict["__{}__".format(dunder)] = (tp_as_name, impl_method)
+
+# divmod isn't a dunder, still make it overridable
+override_dict['divmod()'] = ('tp_as_number', "nb_divmod")
+
+
+def _is_dunder(func_name):
+ return func_name.startswith("__") and func_name.endswith("__")
+
+
+def _curse_special(klass, attr, func):
+ """
+ Curse one of the "dunder" methods, i.e. methods beginning with __ which have a
+ precial resolution code path
+ """
+ assert isinstance(func, FunctionType)
+
+ tp_as_name, impl_method = override_dict[attr]
+
+ # get the pointer to the correct tp_as_* structure
+ # or create it if it doesn't exist
+ tyobj = PyTypeObject.from_address(id(klass))
+ tp_as_ptr = getattr(tyobj, tp_as_name)
+ struct_ty = PyTypeObject_as_types_dict[tp_as_name]
+ if not tp_as_ptr:
+ # allocate new array
+ tp_as_obj = struct_ty()
+ tp_as_dict[(klass, attr)] = tp_as_obj
+ tp_as_new_ptr = ctypes.cast(ctypes.addressof(tp_as_obj),
+ ctypes.POINTER(struct_ty))
+
+ setattr(tyobj, tp_as_name, tp_as_new_ptr)
+ tp_as = tp_as_ptr[0]
+
+
+ # find the C function type
+ for fname, ftype in struct_ty._fields_:
+ if fname == impl_method:
+ cfunc_t = ftype
+
+ @wraps(func)
+ def wrapper(*args, **kwargs):
+ """
+ This wrapper returns the address of the resulting object as a
+ python integer which is then converted to a pointer by ctypes
+ """
+ try:
+ return func(*args, **kwargs)
+ except NotImplementedError:
+ return NotImplementedRet
+
+ cfunc = cfunc_t(wrapper)
+ tp_func_dict[(klass, attr)] = cfunc
+
+ setattr(tp_as, impl_method, cfunc)
+
+
+def _revert_special(klass, attr):
+ tp_as_name, impl_method = override_dict[attr]
+ tyobj = PyTypeObject.from_address(id(klass))
+ tp_as_ptr = getattr(tyobj, tp_as_name)
+ if tp_as_ptr:
+ tp_as = tp_as_ptr[0]
+
+ struct_ty = PyTypeObject_as_types_dict[tp_as_name]
+ for fname, ftype in struct_ty._fields_:
+ if fname == impl_method:
+ cfunc_t = ftype
+
+ setattr(tp_as, impl_method,
+ ctypes.cast(ctypes.c_void_p(None), cfunc_t))
+
def curse(klass, attr, value, hide_from_dir=False):
"""Curse a built-in `klass` with `attr` set to `value`
@@ -93,15 +405,24 @@
>>> "yo".hello()
"yoyo"
"""
+ if _is_dunder(attr):
+ if sys.version_info < (3, 3):
+ raise NotImplementedError(
+ "Dunder overloading is only supported on Python >= 3.3")
+ _curse_special(klass, attr, value)
+ return
+
dikt = patchable_builtin(klass)
old_value = dikt.get(attr, None)
old_name = '_c_%s' % attr # do not use .format here, it breaks py2.{5,6}
- if old_value:
- dikt[old_name] = old_value
+
+ # Patch the thing
+ dikt[attr] = value
if old_value:
- dikt[attr] = value
+ hide_from_dir = False # It was already in dir
+ dikt[old_name] = old_value
try:
dikt[attr].__name__ = old_value.__name__
@@ -111,8 +432,8 @@
dikt[attr].__qualname__ = old_value.__qualname__
except AttributeError:
pass
- else:
- dikt[attr] = value
+
+ ctypes.pythonapi.PyType_Modified(ctypes.py_object(klass))
if hide_from_dir:
__hidden_elements__[klass.__name__].append(attr)
@@ -140,9 +461,14 @@
AttributeError: 'str' object has no attribute 'strip'
"""
+ if _is_dunder(attr):
+ _revert_special(klass, attr)
+
dikt = patchable_builtin(klass)
del dikt[attr]
+ ctypes.pythonapi.PyType_Modified(ctypes.py_object(klass))
+
def curses(klass, name):
"""Decorator to add decorated method named `name` the class `klass`
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forbiddenfruit-0.1.2/setup.py new/forbiddenfruit-0.1.3/setup.py
--- old/forbiddenfruit-0.1.2/setup.py 2016-03-31 05:25:16.000000000 +0200
+++ new/forbiddenfruit-0.1.3/setup.py 2019-04-20 16:32:31.000000000 +0200
@@ -1,7 +1,11 @@
# forbiddenfruit - Patch built-in python objects
#
-# Copyright (c) 2013 Lincoln de Sousa <lincoln(a)comum.org>
+# Copyright (c) 2013,2019 Lincoln de Sousa <lincoln(a)clarete.li>
#
+# This program is dual licensed under GPLv3 and MIT.
+#
+# GPLv3
+# -----
# 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
@@ -14,6 +18,28 @@
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# MIT
+# ---
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
import os
from setuptools import setup, find_packages, Extension
@@ -21,18 +47,23 @@
ffruit = Extension('ffruit', sources=['tests/unit/ffruit.c'])
+
local_file = lambda f: \
open(os.path.join(os.path.dirname(__file__), f)).read()
if __name__ == '__main__':
setup(
name='forbiddenfruit',
- version='0.1.2',
+ version='0.1.3',
description='Patch python built-in objects',
long_description=local_file('README.md'),
author='Lincoln de Sousa',
- author_email='lincoln(a)comum.org',
+ author_email='lincoln(a)clarete.li',
url='https://github.com/clarete/forbiddenfruit',
packages=find_packages(exclude=['*tests*']),
ext_modules=[ffruit],
+ classifiers=[
+ 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)',
+ 'License :: OSI Approved :: MIT License',
+ ],
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forbiddenfruit-0.1.2/tests/unit/test_forbidden_fruit.py new/forbiddenfruit-0.1.3/tests/unit/test_forbidden_fruit.py
--- old/forbiddenfruit-0.1.2/tests/unit/test_forbidden_fruit.py 2016-03-31 05:25:16.000000000 +0200
+++ new/forbiddenfruit-0.1.3/tests/unit/test_forbidden_fruit.py 2019-04-20 16:32:31.000000000 +0200
@@ -1,10 +1,21 @@
+import sys
from datetime import datetime
from forbiddenfruit import curses, curse, reverse
+from types import FunctionType
+from nose.tools import nottest, istest
# Our stub! :)
from . import ffruit
+
+def almost_equal(a, b, e=0.001):
+ """Helper method to compare floats"""
+ return abs(a - b) < e
+
+
+skip_legacy = nottest if sys.version_info < (3, 3) else istest
+
def test_cursing_a_builting_class():
# Given that I have a function that returns *blah*
@@ -120,20 +131,21 @@
assert obj.my_method() == "YoYo"
-def test_overriding_dict_pop():
+def test_overriding_list_append():
"The `curse` function should be able to curse existing symbols"
# Given that I have an instance of a python class
- obj = {'a': 1, 'b': 2}
+ obj = []
# When I curse an instance method
- curse(dict, "pop", lambda self, key: self[key])
+ fn = lambda self, v: self._c_append(v) or self
+ foo = curse(list, "append", fn)
# Then I see that my object was cursed properly
- assert obj.pop('a') == 1
- assert obj.pop('b') == 2
- assert 'a' in obj
- assert 'b' in obj
+ assert obj.append(1) == [1]
+ assert obj.append(2) == [1, 2]
+ assert 1 in obj
+ assert 2 in obj
def test_curses_decorator():
@@ -161,3 +173,118 @@
# Then I see that `dir()` correctly returns a sorted list of those names
assert 'some_name' in dir()
assert dir() == sorted(locals().keys())
+
+
+@skip_legacy
+def test_dunder_func_chaining():
+ """Overload * (mul) operator to to chaining between functions"""
+ def matmul_chaining(self, other):
+ if not isinstance(other, FunctionType):
+ raise NotImplementedError()
+ def wrapper(*args, **kwargs):
+ res = other(*args, **kwargs)
+ if hasattr(res, "__iter__"):
+ return self(*res)
+ return self(res)
+
+ return wrapper
+
+ curse(FunctionType, "__mul__", matmul_chaining)
+ f = lambda x, y: x * y
+ g = lambda x: (x, x)
+
+ squared = f * g
+
+ for i in range(0, 10, 2):
+ assert squared(i) == i ** 2
+
+
+@skip_legacy
+def test_dunder_list_map():
+ """Overload * (__mul__) operator to apply function to a list"""
+ def map_list(func, list_):
+ if not callable(func):
+ raise NotImplementedError()
+ return map(func, list_)
+
+ curse(list, "__mul__", map_list)
+
+ list_ = list(range(10))
+ times_2 = lambda x: x * 2
+
+ assert list(times_2 * list_) == list(range(0, 20, 2))
+
+
+@skip_legacy
+def test_dunder_unary():
+ """Overload ~ operator to compute a derivative of function"""
+ def derive_func(func):
+ e = 0.001
+ def wrapper(x):
+ """Poor man's derivation"""
+ x_0 = x - e
+ x_1 = x + e
+ y_delta = func(x_1) - func(x_0)
+ return y_delta / (2 * e)
+ return wrapper
+
+ curse(FunctionType, "__inv__", derive_func)
+
+ f = lambda x: x**2 + x
+ # true derivation
+ f_ = lambda x: 2*x + 1
+
+ assert almost_equal((~f)(10), f_(10))
+
+
+@skip_legacy
+def test_sequence_dunder():
+ def derive_func(func, deriv_grad):
+ if deriv_grad == 0:
+ return func
+
+ e = 0.0000001
+ def wrapper(x):
+ return (func(x + e) - func(x - e)) / (2 * e)
+ if deriv_grad == 1:
+ return wrapper
+ return wrapper[deriv_grad - 1]
+
+ curse(FunctionType, "__getitem__", derive_func)
+
+ # a function an its derivations
+ f = lambda x: x ** 3 - 2 * x ** 2
+ f_1 = lambda x: 3 * x ** 2 - 4 * x
+ f_2 = lambda x: 6 * x - 4
+
+ for x in range(0, 10):
+ x = float(x) / 10.
+ assert almost_equal(f(x), f[0](x))
+ assert almost_equal(f_1(x), f[1](x))
+ # our hacky derivation becomes numerically unstable here
+ assert almost_equal(f_2(x), f[2](x), e=.01)
+
+
+@skip_legacy
+def test_dunder_list_revert():
+ """Test reversion of a curse with dunders"""
+ def map_list(func, list_):
+ if not callable(func):
+ raise NotImplementedError()
+ return map(func, list_)
+
+ curse(list, "__add__", map_list)
+
+ list_ = list(range(10))
+ times_2 = lambda x: x * 2
+
+ assert list(times_2 + list_) == list(range(0, 20, 2))
+
+ reverse(list, "__add__")
+ try:
+ times_2 + list_
+ except TypeError:
+ pass
+ else:
+ # should always raise an exception
+ assert False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/forbiddenfruit-0.1.2/tox.ini new/forbiddenfruit-0.1.3/tox.ini
--- old/forbiddenfruit-0.1.2/tox.ini 2016-03-31 05:25:16.000000000 +0200
+++ new/forbiddenfruit-0.1.3/tox.ini 2019-04-20 16:32:31.000000000 +0200
@@ -4,7 +4,7 @@
# and then run "tox" from this directory.
[tox]
-envlist = py24, py25, py26, py27, py30, py31, py32, py33
+envlist = py27, py30, py33, py34, py35, py36, py37
[testenv]
commands = make
++++++ COPYING.GPL ++++++
++++ 674 lines (skipped)
1
0
Hello community,
here is the log from the commit of package python-tinyrecord for openSUSE:Factory checked in at 2019-05-15 12:34:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-tinyrecord (Old)
and /work/SRC/openSUSE:Factory/.python-tinyrecord.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-tinyrecord"
Wed May 15 12:34:41 2019 rev:1 rq:702962 version:0.1.5
Changes:
--------
New Changes file:
--- /dev/null 2019-05-02 15:18:01.516169518 +0200
+++ /work/SRC/openSUSE:Factory/.python-tinyrecord.new.5148/python-tinyrecord.changes 2019-05-15 12:34:47.472465864 +0200
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------
+Thu May 9 11:03:35 AM UTC 2019 - John Vandenberg <jayvdb(a)gmail.com>
+
+- Initial spec for v0.1.5
New:
----
LICENSE
python-tinyrecord.changes
python-tinyrecord.spec
tinyrecord-0.1.5.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-tinyrecord.spec ++++++
#
# spec file for package python-tinyrecord
#
# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via http://bugs.opensuse.org/
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-tinyrecord
Version: 0.1.5
Release: 0
License: MIT
Summary: Atomic transactions for TinyDB
Url: https://github.com/eugene-eeo/tinyrecord
Group: Development/Languages/Python
Source: https://github.com/eugene-eeo/tinyrecord/archive/%{version}.tar.gz#/tinyrec…
Source1: https://raw.githubusercontent.com/eugene-eeo/tinyrecord/master/LICENSE
BuildRequires: python-rpm-macros
BuildRequires: %{python_module pytest-runner}
BuildRequires: %{python_module setuptools}
BuildRequires: %{python_module tinydb}
BuildRequires: fdupes
Requires: python-tinydb
BuildArch: noarch
%python_subpackages
%description
Atomic transactions for TinyDB.
%prep
%setup -q -n tinyrecord-%{version}
cp %{SOURCE1} .
%build
%python_build
%install
%python_install
%python_expand %fdupes %{buildroot}%{$python_sitelib}
%check
%{python_expand export PYTHONPATH=%{buildroot}%{$python_sitelib}
$python setup.py pytest --addopts="tests.py"
$python ./test.py
}
%files %{python_files}
%license LICENSE
%doc README.rst
%{python_sitelib}/*
%changelog
++++++ LICENSE ++++++
MIT License
Copyright (c) 2014 Eugene Eeo
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
1
0
Hello community,
here is the log from the commit of package python-HTTPolice for openSUSE:Factory checked in at 2019-05-15 12:34:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-HTTPolice (Old)
and /work/SRC/openSUSE:Factory/.python-HTTPolice.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-HTTPolice"
Wed May 15 12:34:29 2019 rev:2 rq:702958 version:0.8.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-HTTPolice/python-HTTPolice.changes 2019-02-26 22:22:36.198061852 +0100
+++ /work/SRC/openSUSE:Factory/.python-HTTPolice.new.5148/python-HTTPolice.changes 2019-05-15 12:34:30.680513623 +0200
@@ -1,0 +2,15 @@
+Tue May 14 17:33:35 UTC 2019 - Ethan Apodaca <eapodaca(a)suse.com>
+
+- Drop python2 support
+- Remove py34-no-singledispatch.patch
+- Replace brotlipy dependency with Brotli
+- Remove dependancies that are not needed to build.
+- Update to v0.8.0
+ * Changes
+ + Dropped Python 2 support. If you need it, use the older versions.
+ + HTTPolice no longer requires six nor singledispatch.
+ + HTTPolice now pulls in Google's Brotli instead of brotlipy,
+ but this is merely a packaging change; it can work with either.
+ + Notices 1299 and 1300 are no longer reported on Alt-Svc.
+
+-------------------------------------------------------------------
Old:
----
HTTPolice-0.7.0.tar.gz
py34-no-singledispatch.patch
New:
----
HTTPolice-0.8.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-HTTPolice.spec ++++++
--- /var/tmp/diff_new_pack.tjd0b8/_old 2019-05-15 12:34:31.484511307 +0200
+++ /var/tmp/diff_new_pack.tjd0b8/_new 2019-05-15 12:34:31.488511296 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-HTTPolice
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -12,42 +12,36 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
+#
+
+%define skip_python2 1
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-HTTPolice
-Version: 0.7.0
+Version: 0.8.0
Release: 0
-License: MIT
Summary: Validator for HTTP
-Url: https://github.com/vfaronov/httpolice
+License: MIT
Group: Development/Languages/Python
+URL: https://github.com/vfaronov/httpolice
Source: https://files.pythonhosted.org/packages/source/H/HTTPolice/HTTPolice-%{vers…
-Patch0: https://github.com/vfaronov/httpolice/commit/4da2bde.patch#/py34-no-singled…
-BuildRequires: %{python_module setuptools}
-BuildRequires: fdupes
-BuildRequires: python-rpm-macros
+BuildRequires: %{python_module Brotli >= 1.0.1}
BuildRequires: %{python_module bitstring >= 3.1.4}
-BuildRequires: %{python_module brotlipy >= 0.5.1}
BuildRequires: %{python_module defusedxml >= 0.5.0}
BuildRequires: %{python_module dominate >= 2.2.0}
-BuildRequires: %{python_module lxml >= 3.6.0}
+BuildRequires: %{python_module lxml >= 4.1.0}
+BuildRequires: %{python_module pytest-cov}
BuildRequires: %{python_module pytest}
-BuildRequires: %{python_module six >= 1.10.0}
-BuildRequires: python2-singledispatch >= 3.4.0.3
-BuildRequires: python-enum34 >= 1.1.6
+BuildRequires: %{python_module setuptools}
+BuildRequires: fdupes
+BuildRequires: python-rpm-macros
+Requires: python-Brotli >= 1.0.1
Requires: python-bitstring >= 3.1.4
-Requires: python-brotlipy >= 0.5.1
Requires: python-defusedxml >= 0.5.0
Requires: python-dominate >= 2.2.0
-Requires: python-lxml >= 3.6.0
-Requires: python-six >= 1.10.0
-%ifpython2
-Requires: python-enum34 >= 1.1.6
-Requires: python-singledispatch >= 3.4.0.3
-%endif
+Requires: python-lxml >= 4.1.0
BuildArch: noarch
-
%python_subpackages
%description
@@ -57,7 +51,6 @@
%prep
%setup -q -n HTTPolice-%{version}
-%patch0 -p1
%build
export LANG=en_US.UTF-8
@@ -70,7 +63,7 @@
%check
export LANG=en_US.UTF-8
-%python_exec -m pytest -o addopts=-v
+%pytest
%files %{python_files}
%license LICENSE.txt
++++++ HTTPolice-0.7.0.tar.gz -> HTTPolice-0.8.0.tar.gz ++++++
++++ 2802 lines of diff (skipped)
1
0
Hello community,
here is the log from the commit of package python-pytools for openSUSE:Factory checked in at 2019-05-15 12:34:25
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pytools (Old)
and /work/SRC/openSUSE:Factory/.python-pytools.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pytools"
Wed May 15 12:34:25 2019 rev:7 rq:702957 version:2019.1.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pytools/python-pytools.changes 2018-12-24 11:42:53.365372463 +0100
+++ /work/SRC/openSUSE:Factory/.python-pytools.new.5148/python-pytools.changes 2019-05-15 12:34:26.576525443 +0200
@@ -1,0 +2,6 @@
+Tue May 14 18:44:58 UTC 2019 - John Jolly <jjolly(a)suse.com>
+
+- Update to version 2019.1.1
+ + No upstream changelog available
+
+-------------------------------------------------------------------
Old:
----
pytools-2018.5.2.tar.gz
New:
----
pytools-2019.1.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pytools.spec ++++++
--- /var/tmp/diff_new_pack.Rz6aw0/_old 2019-05-15 12:34:27.212523611 +0200
+++ /var/tmp/diff_new_pack.Rz6aw0/_new 2019-05-15 12:34:27.216523599 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-pytools
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-pytools
-Version: 2018.5.2
+Version: 2019.1.1
Release: 0
Summary: A collection of tools for Python
License: MIT
@@ -57,9 +57,12 @@
%install
%python_install
-%fdupes %{buildroot}
+%python_expand %fdupes %{buildroot}%{python_sitelib}
%check
+# The tests are successful when run only with python2.
+# When run with python3, the tests require mpi4py and all the
+# necessary libraries and configuration that comes with MPI.
python2 setup.py test
%files %{python_files}
++++++ pytools-2018.5.2.tar.gz -> pytools-2019.1.1.tar.gz ++++++
++++ 3481 lines of diff (skipped)
1
0
Hello community,
here is the log from the commit of package python-annoy for openSUSE:Factory checked in at 2019-05-15 12:34:21
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-annoy (Old)
and /work/SRC/openSUSE:Factory/.python-annoy.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-annoy"
Wed May 15 12:34:21 2019 rev:5 rq:702925 version:1.15.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-annoy/python-annoy.changes 2019-03-19 09:59:03.608086873 +0100
+++ /work/SRC/openSUSE:Factory/.python-annoy.new.5148/python-annoy.changes 2019-05-15 12:34:23.232535073 +0200
@@ -1,0 +2,10 @@
+Tue May 14 17:27:38 UTC 2019 - svasudevan(a)suse.com
+
+- Update to 1.15.2
+ * Fix #379 error handling in save()
+ * Fix compile issue in linux
+ * Fix popcount #366
+ * rebased reproduceable.patch
+ * Some more misc
+
+-------------------------------------------------------------------
Old:
----
annoy-1.15.1.tar.gz
New:
----
annoy-1.15.2.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-annoy.spec ++++++
--- /var/tmp/diff_new_pack.2uoUjr/_old 2019-05-15 12:34:23.900533149 +0200
+++ /var/tmp/diff_new_pack.2uoUjr/_new 2019-05-15 12:34:23.904533138 +0200
@@ -12,18 +12,18 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via https://bugs.opensuse.org/
+# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-annoy
-Version: 1.15.1
+Version: 1.15.2
Release: 0
Summary: Approximation of Nearest Neighbors
License: Apache-2.0
Group: Development/Languages/Python
-URL: https://github.com/spotify/annoy
+Url: https://github.com/spotify/annoy
Source: https://files.pythonhosted.org/packages/source/a/annoy/annoy-%{version}.tar…
# PATCH-FIX-OPENSUSE boo#1100677
Patch0: reproducible.patch
++++++ annoy-1.15.1.tar.gz -> annoy-1.15.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/annoy-1.15.1/PKG-INFO new/annoy-1.15.2/PKG-INFO
--- old/annoy-1.15.1/PKG-INFO 2019-02-22 17:11:43.000000000 +0100
+++ new/annoy-1.15.2/PKG-INFO 2019-04-17 03:52:00.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: annoy
-Version: 1.15.1
+Version: 1.15.2
Summary: Approximate Nearest Neighbors in C++/Python optimized for memory usage and loading/saving to disk.
Home-page: https://github.com/spotify/annoy
Author: Erik Bernhardsson
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/annoy-1.15.1/annoy.egg-info/PKG-INFO new/annoy-1.15.2/annoy.egg-info/PKG-INFO
--- old/annoy-1.15.1/annoy.egg-info/PKG-INFO 2019-02-22 17:11:43.000000000 +0100
+++ new/annoy-1.15.2/annoy.egg-info/PKG-INFO 2019-04-17 03:52:00.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: annoy
-Version: 1.15.1
+Version: 1.15.2
Summary: Approximate Nearest Neighbors in C++/Python optimized for memory usage and loading/saving to disk.
Home-page: https://github.com/spotify/annoy
Author: Erik Bernhardsson
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/annoy-1.15.1/setup.cfg new/annoy-1.15.2/setup.cfg
--- old/annoy-1.15.1/setup.cfg 2019-02-22 17:11:43.000000000 +0100
+++ new/annoy-1.15.2/setup.cfg 2019-04-17 03:52:00.000000000 +0200
@@ -5,5 +5,4 @@
[egg_info]
tag_build =
tag_date = 0
-tag_svn_revision = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/annoy-1.15.1/setup.py new/annoy-1.15.2/setup.py
--- old/annoy-1.15.1/setup.py 2019-02-22 17:11:27.000000000 +0100
+++ new/annoy-1.15.2/setup.py 2019-04-17 03:51:46.000000000 +0200
@@ -57,7 +57,7 @@
extra_link_args += ['-stdlib=libc++', '-mmacosx-version-min=10.9']
setup(name='annoy',
- version='1.15.1',
+ version='1.15.2',
description='Approximate Nearest Neighbors in C++/Python optimized for memory usage and loading/saving to disk.',
packages=['annoy'],
ext_modules=[
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/annoy-1.15.1/src/annoylib.h new/annoy-1.15.2/src/annoylib.h
--- old/annoy-1.15.1/src/annoylib.h 2019-02-21 17:39:33.000000000 +0100
+++ new/annoy-1.15.2/src/annoylib.h 2019-04-10 03:52:02.000000000 +0200
@@ -26,6 +26,7 @@
#include <sys/types.h>
#include <fcntl.h>
#include <stddef.h>
+
#if defined(_MSC_VER) && _MSC_VER == 1500
typedef unsigned char uint8_t;
typedef signed __int32 int32_t;
@@ -44,6 +45,7 @@
#include <sys/mman.h>
#endif
+#include <cerrno>
#include <string.h>
#include <math.h>
#include <vector>
@@ -67,11 +69,9 @@
#ifndef _MSC_VER
#define popcount __builtin_popcountll
-#elif _MSC_VER == 1500
+#else // See #293, #358
#define isnan(x) _isnan(x)
#define popcount cole_popcount
-#else
-#define popcount __popcnt64
#endif
#ifndef NO_MANUAL_VECTORIZATION
@@ -880,8 +880,15 @@
if (f == NULL)
return false;
- fwrite(_nodes, _s, _n_nodes, f);
- fclose(f);
+ if (fwrite(_nodes, _s, _n_nodes, f) != (size_t) _n_nodes) {
+ showUpdate("Unable to write %s\n", strerror(errno));
+ return false;
+ }
+
+ if (fclose(f) == EOF) {
+ showUpdate("Unable to close %s\n", strerror(errno));
+ return false;
+ }
unload();
return load(filename, prefault=false);
@@ -924,15 +931,15 @@
return false;
}
off_t size = lseek(_fd, 0, SEEK_END);
+ int flags = MAP_SHARED;
+ if (prefault) {
#ifdef MAP_POPULATE
- const int populate = prefault ? MAP_POPULATE : 0;
- _nodes = (Node*)mmap(
- 0, size, PROT_READ, MAP_SHARED | populate, _fd, 0);
+ flags |= MAP_POPULATE;
#else
- _nodes = (Node*)mmap(
- 0, size, PROT_READ, MAP_SHARED, _fd, 0);
+ showUpdate("prefault is set to true, but MAP_POPULATE is not defined on this platform");
#endif
-
+ }
+ _nodes = (Node*)mmap(0, size, PROT_READ, flags, _fd, 0);
_n_nodes = (S)(size / _s);
// Find the roots by scanning the end of the file and taking the nodes with most descendants
++++++ reproducible.patch ++++++
--- /var/tmp/diff_new_pack.2uoUjr/_old 2019-05-15 12:34:24.084532620 +0200
+++ /var/tmp/diff_new_pack.2uoUjr/_new 2019-05-15 12:34:24.084532620 +0200
@@ -3,10 +3,10 @@
https://bugzilla.opensuse.org/show_bug.cgi?id=1100677
-Index: annoy-1.15.1/setup.py
+Index: annoy-1.15.2/setup.py
===================================================================
---- annoy-1.15.1.orig/setup.py
-+++ annoy-1.15.1/setup.py
+--- annoy-1.15.2.orig/setup.py
++++ annoy-1.15.2/setup.py
@@ -36,26 +36,10 @@ with codecs.open('README.rst', encoding=
long_description = readme_note + fobj.read()
@@ -33,5 +33,5 @@
- extra_link_args += ['-stdlib=libc++', '-mmacosx-version-min=10.9']
-
setup(name='annoy',
- version='1.15.1',
+ version='1.15.2',
description='Approximate Nearest Neighbors in C++/Python optimized for memory usage and loading/saving to disk.',
1
0
Hello community,
here is the log from the commit of package python-envisage for openSUSE:Factory checked in at 2019-05-15 12:34:17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-envisage (Old)
and /work/SRC/openSUSE:Factory/.python-envisage.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-envisage"
Wed May 15 12:34:17 2019 rev:4 rq:702923 version:4.7.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-envisage/python-envisage.changes 2018-12-31 09:47:19.254170698 +0100
+++ /work/SRC/openSUSE:Factory/.python-envisage.new.5148/python-envisage.changes 2019-05-15 12:34:18.588548448 +0200
@@ -1,0 +2,6 @@
+Tue May 14 17:34:03 UTC 2019 - Gary Smith <GSmith(a)suse.com>
+
+- Update to version 4.7.2
+ * no changelog
+
+-------------------------------------------------------------------
Old:
----
envisage-4.7.0.tar.gz
New:
----
envisage-4.7.2.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-envisage.spec ++++++
--- /var/tmp/diff_new_pack.ecL7dU/_old 2019-05-15 12:34:19.160546801 +0200
+++ /var/tmp/diff_new_pack.ecL7dU/_new 2019-05-15 12:34:19.168546778 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-envisage
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -12,7 +12,7 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
@@ -21,7 +21,7 @@
%define X_display ":98"
%bcond_with test
Name: python-envisage
-Version: 4.7.0
+Version: 4.7.2
Release: 0
Summary: Extensible application framework for Python
# Source code is under BSD but images are under different licenses
++++++ envisage-4.7.0.tar.gz -> envisage-4.7.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/CHANGES.txt new/envisage-4.7.2/CHANGES.txt
--- old/envisage-4.7.0/CHANGES.txt 1970-01-01 01:00:00.000000000 +0100
+++ new/envisage-4.7.2/CHANGES.txt 2019-05-03 11:49:52.000000000 +0200
@@ -0,0 +1,164 @@
+====================
+ Envisage CHANGELOG
+====================
+
+Version 4.7.2
+=============
+
+Released: 03 May 2019
+
+Fixes
+-----
+
+* Fix some broken imports and name errors in the ``envisage.developer``
+ package. (#130)
+* Add missing test data to support running tests on Python 3.7. (#136)
+* Fix reversed interpretation of the
+ ``TasksApplication.always_use_default_layout`` when creating task windows.
+ (#144)
+* In the ``InternalIPKernel`` plugin, restore original standard streams
+ (``stdout``, ``stdin``, ``stderr``) at plugin stop time. (#146)
+* In the ``InternalIPKernel`` plugin, fix ``ResourceWarnings`` from
+ unclosed pipes attached to qt consoles. (#147)
+
+
+Version 4.7.1
+=============
+
+Released : 31 January 2019
+
+Changes
+-------
+
+* Replace use of deprecated ``HasTraits.set`` method (#118)
+
+Fixes
+-----
+
+* Fix IPython GUI kernel issue when used with ipykernel 4.7.0 (#123)
+* Fix infinite recursion issue when harvesting extension methods (#121)
+
+
+Version 4.7.0
+=============
+
+Changes
+-------
+
+* Update CI setup and include ``ipykernel`` in devenv (#105, #111, #114)
+* Use ``--gui`` rather than ``--matplotlib`` when starting IPython kernel (#101)
+* Downgrade level of a logging message (#95)
+
+Fixes
+-----
+
+* Fix old-style relative import (#109)
+* Fix attractors example (#103)
+* Stop the IOPubThread as part of IPython kernel shutdown (#100)
+* Fix Sphinx conf to be able to build docs again (#91)
+* Fix deprecated IPython import (#92)
+* Fix task layout serialization under Python 3 (#90)
+
+
+Version 4.6.0
+=============
+
+This is an incremental release, mainly consisting of bug fixes. The most
+significant change is the support for IPython >= 4 in the IPython plugin.
+
+Thanks to @corranwebster, @dpinte, @itziakos, @jonathanrocher, @kamalx,
+@rahulporuri, @robmcmullen, @sjagoe
+
+Enhancements
+------------
+
+* IPython kernel plugin now supports IPython >= 4 (#82)
+* Remove usage of deprecated IPython QtConsole API (#80)
+* Defer selection of toolkit and avoid creating GUI applications as side-effects as
+ much as possible (#77, #76)
+
+Fixes
+-----
+
+* Fixes for tests under Python 3.5 (#86)
+* Work around for issue with Traits in Python 3 (#78)
+* Replace uses of ‘file’ and ‘execfile’ (#75)
+* Fix MOTD_Using_Eggs example (#66)
+* Fix broken and outdated links in documentation (#72)
+* Fix link to docs from README (#70)
+* Fix degenerate case where window is created with no layout (#44)
+
+
+Version 4.5.1
+=============
+
+Enhancements
+------------
+
+* Add tox for testing package install (#67)
+
+Fixes
+-----
+
+* Include missing test files in the package data (#67)
+* Include missing test cases for Python 3.4 (#67)
+
+
+Version 4.5.0
+=============
+
+New features
+------------
+
+* IPythonKernelPlugin for Tasks: run an IPython kernel within the
+ envisage app and expose it as a service (#54).
+* Envisage now supports Python 3.4 (#61).
+
+Enhancements
+------------
+
+* Allow loading plugins from an egg basket even when some eggs are
+ invalid (#40, #46).
+* Add a simple ``GUIApplication`` to bootstrap basic plugin-driven
+ applications (#34).
+* Split the IPython kernel and IPython menu action into two separate
+ plugins for flexibility (#57).
+
+Fixes
+-----
+
+* Use new Traits interfaces and adaptation implementation (#37).
+* Envisage now configures the logger with a ``NullHandler`` to avoid
+ spurios unconfigured logger warnings (#45).
+* Envisage no longer swallows exceptions in plugin startup (#50).
+* Various fixes to continuous integration configuration (#47, #60).
+
+
+Version 4.4.0
+=============
+
+The major component of this feature is to work with the new
+``traits.adaptation`` mechanism in place of the deprecated
+``traits.protocols``, maintaining compatibility with ``traits`` version
+4.4.0.
+
+This release also adds a new method to retrieve a service that is
+required by the application and provides documentation and test updates.
+
+
+New features
+------------
+
+* Added a simple GUIApplication class (673c8f6)
+* Added a method to get a required service (94dfdea)
+
+Enhancements
+------------
+
+* Updated to use the new traits.adaptation functionality (34fa5e6)
+
+Fixes
+-----
+
+* Updated links to point to github instead of svn codebase (87cdb87)
+* Fixed test cases and added to Travis-CI (6c11d9f)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/LICENSE.txt new/envisage-4.7.2/LICENSE.txt
--- old/envisage-4.7.0/LICENSE.txt 1970-01-01 01:00:00.000000000 +0100
+++ new/envisage-4.7.2/LICENSE.txt 2018-09-10 16:20:43.000000000 +0200
@@ -0,0 +1,28 @@
+This software is OSI Certified Open Source Software.
+OSI Certified is a certification mark of the Open Source Initiative.
+
+Copyright (c) 2006, Enthought, Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+ * 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.
+ * Neither the name of Enthought, Inc. 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 OWNER 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.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/MANIFEST.in new/envisage-4.7.2/MANIFEST.in
--- old/envisage-4.7.0/MANIFEST.in 2018-08-10 20:08:30.000000000 +0200
+++ new/envisage-4.7.2/MANIFEST.in 2019-05-03 10:28:58.000000000 +0200
@@ -1,3 +1,9 @@
+include CHANGES.txt
+include LICENSE.txt
+include MANIFEST.in
+include README.rst
+include image_LICENSE.txt
+include image_LICENSE_CP.txt
recursive-include envisage/tests/plugins *.py
recursive-include envisage/tests/eggs *.egg
recursive-include envisage/tests/bad_eggs *.egg
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/PKG-INFO new/envisage-4.7.2/PKG-INFO
--- old/envisage-4.7.0/PKG-INFO 2018-08-15 21:19:05.000000000 +0200
+++ new/envisage-4.7.2/PKG-INFO 2019-05-03 12:38:04.000000000 +0200
@@ -1,13 +1,14 @@
-Metadata-Version: 1.1
+Metadata-Version: 1.2
Name: envisage
-Version: 4.7.0
+Version: 4.7.2
Summary: extensible application framework
Home-page: http://docs.enthought.com/envisage
-Author: ETS Developers
-Author-email: enthought-dev(a)enthought.com
+Author: Martin Chilvers, et. al.
+Author-email: info(a)enthought.com
+Maintainer: ETS Developers
+Maintainer-email: enthought-dev(a)enthought.com
License: BSD
Download-URL: https://github.com/enthought/envisage
-Description-Content-Type: UNKNOWN
Description: ==========================================
envisage: extensible application framework
==========================================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/_version.py new/envisage-4.7.2/envisage/_version.py
--- old/envisage-4.7.0/envisage/_version.py 2018-08-15 21:19:04.000000000 +0200
+++ new/envisage-4.7.2/envisage/_version.py 2019-05-03 12:38:03.000000000 +0200
@@ -1,6 +1,6 @@
# This file was automatically generated from the `setup.py` script.
-version = '4.7.0'
-full_version = '4.7.0'
+version = '4.7.2'
+full_version = '4.7.2'
git_revision = 'Unknown'
is_released = True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/developer/charm/charm.py new/envisage-4.7.2/envisage/developer/charm/charm.py
--- old/envisage-4.7.0/envisage/developer/charm/charm.py 2018-08-10 20:08:30.000000000 +0200
+++ new/envisage-4.7.2/envisage/developer/charm/charm.py 2019-05-03 11:49:52.000000000 +0200
@@ -2,7 +2,7 @@
# Enthought library imports.
-from envisage.developer.api import CodeBrowser, Module
+from envisage.developer.code_browser.api import CodeBrowser, Module
from traits.api import Event, HasTraits, Instance, Str
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/developer/ui/view/plugin_browser.py new/envisage-4.7.2/envisage/developer/ui/view/plugin_browser.py
--- old/envisage-4.7.0/envisage/developer/ui/view/plugin_browser.py 2018-08-10 20:08:30.000000000 +0200
+++ new/envisage-4.7.2/envisage/developer/ui/view/plugin_browser.py 2019-05-03 11:49:52.000000000 +0200
@@ -2,13 +2,13 @@
# Enthought library imports.
-from envisage.api import ExtensionPoint, IPlugin
+from envisage.api import ExtensionPoint, IApplication, IExtensionPoint, IPlugin
from traits.api import Delegate, HasTraits, Instance, List, Property
from traits.api import Code, Str
from traitsui.api import Item, TableEditor, View, VGroup
from traitsui.table_column import ObjectColumn # fixme: non-api!
-class ExtensionPointModel(Hastraits):
+class ExtensionPointModel(HasTraits):
""" A model for browsing an extension point. """
# The plugin that offered the extension point.
@@ -21,7 +21,7 @@
-class ExtensionModel(Hastraits):
+class ExtensionModel(HasTraits):
""" A model for browsing a contribution to an extension point. """
# The plugin that made the contribution.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/extension_point_binding.py new/envisage-4.7.2/envisage/extension_point_binding.py
--- old/envisage-4.7.0/envisage/extension_point_binding.py 2018-08-10 20:08:30.000000000 +0200
+++ new/envisage-4.7.2/envisage/extension_point_binding.py 2019-05-03 10:28:58.000000000 +0200
@@ -141,7 +141,7 @@
value = self.extension_registry.get_extensions(self.extension_point_id)
traits = {self.trait_name : value}
- self.obj.set(trait_change_notify=notify, **traits)
+ self.obj.trait_set(trait_change_notify=notify, **traits)
return
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/plugin.py new/envisage-4.7.2/envisage/plugin.py
--- old/envisage-4.7.0/envisage/plugin.py 2018-08-10 20:08:30.000000000 +0200
+++ new/envisage-4.7.2/envisage/plugin.py 2019-05-03 10:28:58.000000000 +0200
@@ -365,9 +365,13 @@
""" Harvest all method-based contributions. """
extensions = []
- for name, value in inspect.getmembers(self):
+ # Using inspect.getmembers(self) here will cause an infinite recursion,
+ # so use an internal HasTraits method for inspecting the MRO of the
+ # instance's type to find all methods instead.
+ for name in self._each_trait_method(self):
+ value = getattr(self, name)
if self._is_extension_method(value, extension_point_id):
- result = getattr(self, name)()
+ result = value()
if not isinstance(result, list):
result = [result]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/plugins/ipython_kernel/internal_ipkernel.py new/envisage-4.7.2/envisage/plugins/ipython_kernel/internal_ipkernel.py
--- old/envisage-4.7.0/envisage/plugins/ipython_kernel/internal_ipkernel.py 2018-08-10 20:08:30.000000000 +0200
+++ new/envisage-4.7.2/envisage/plugins/ipython_kernel/internal_ipkernel.py 2019-05-03 11:49:52.000000000 +0200
@@ -3,11 +3,18 @@
https://github.com/ipython/ipython/blob/2.x/examples/Embedding/internal_ipk…
"""
+from distutils.version import StrictVersion as Version
+import sys
+
+import ipykernel
from ipykernel.connect import connect_qtconsole
from ipykernel.kernelapp import IPKernelApp
+from tornado import ioloop
from traits.api import Any, HasStrictTraits, Instance, List
+NEEDS_IOLOOP_PATCH = Version(ipykernel.__version__) >= Version('4.7.0')
+
def gui_kernel(gui_backend):
""" Launch and return an IPython kernel GUI with support.
@@ -49,6 +56,12 @@
#: This is a list of tuples (name, value).
initial_namespace = List()
+ #: sys.stdout value at time kernel was started
+ _original_stdout = Any()
+
+ #: sys.stderr value at time kernel was started
+ _original_stderr = Any()
+
def init_ipkernel(self, gui_backend):
""" Initialize the IPython kernel.
@@ -58,9 +71,23 @@
The GUI mode used to initialize the GUI mode. For options, see
the `ipython --gui` help pages.
"""
+ # The IPython kernel modifies sys.stdout and sys.stderr when started,
+ # and doesn't currently provide a way to restore them. So we restore
+ # them ourselves at shutdown.
+ self._original_stdout = sys.stdout
+ self._original_stderr = sys.stderr
+
# Start IPython kernel with GUI event loop support
self.ipkernel = gui_kernel(gui_backend)
+ # Since ipykernel 4.7, the io_loop attribute of the kernel is not
+ # initialized anymore
+ # Reference: https://github.com/enthought/envisage/issues/107
+ # Workaround: Retrieve the kernel on the IPykernelApp and set the
+ # io_loop without starting it!
+ if NEEDS_IOLOOP_PATCH and not hasattr(self.ipkernel.kernel, 'io_loop'):
+ self.ipkernel.kernel.io_loop = ioloop.IOLoop.instance()
+
# This application will also act on the shell user namespace
self.namespace = self.ipkernel.shell.user_ns
self.namespace.update(dict(self.initial_namespace))
@@ -76,6 +103,8 @@
""" Kill all existing consoles. """
for c in self.consoles:
c.kill()
+ c.stdout.close()
+ c.stderr.close()
self.consoles = []
def shutdown(self):
@@ -87,5 +116,20 @@
self.cleanup_consoles()
self.ipkernel.shell.exit_now = True
self.ipkernel.cleanup_connection_file()
+
+ # The stdout and stderr streams created by the kernel use the
+ # IOPubThread, so we need to close them and restore the originals
+ # before we shut down the thread. Without this, we get obscure
+ # errors of the form "TypeError: heap argument must be a list".
+ kernel_stdout = sys.stdout
+ if kernel_stdout is not self._original_stdout:
+ sys.stdout = self._original_stdout
+ kernel_stdout.close()
+
+ kernel_stderr = sys.stderr
+ if kernel_stderr is not self._original_stderr:
+ sys.stderr = self._original_stderr
+ kernel_stderr.close()
+
self.ipkernel.iopub_thread.stop()
self.ipkernel = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/plugins/ipython_kernel/tests/test_internal_ipkernel.py new/envisage-4.7.2/envisage/plugins/ipython_kernel/tests/test_internal_ipkernel.py
--- old/envisage-4.7.0/envisage/plugins/ipython_kernel/tests/test_internal_ipkernel.py 2018-08-10 20:08:30.000000000 +0200
+++ new/envisage-4.7.2/envisage/plugins/ipython_kernel/tests/test_internal_ipkernel.py 2019-05-03 11:49:52.000000000 +0200
@@ -1,4 +1,5 @@
import gc
+import sys
import unittest
try:
@@ -47,6 +48,27 @@
self.assertEqual(kernel.namespace['x'], 42.1)
kernel.shutdown()
+ def test_shutdown_restores_output_streams(self):
+ original_stdout = sys.stdout
+ original_stderr = sys.stderr
+
+ kernel = InternalIPKernel(initial_namespace=[('x', 42.1)])
+ kernel.init_ipkernel(gui_backend=None)
+ kernel.shutdown()
+
+ self.assertIs(sys.stdout, original_stdout)
+ self.assertIs(sys.stderr, original_stderr)
+
+ def test_shutdown_closes_console_pipes(self):
+ kernel = InternalIPKernel(initial_namespace=[('x', 42.1)])
+ kernel.init_ipkernel(gui_backend=None)
+ console = kernel.new_qt_console()
+ self.assertFalse(console.stdout.closed)
+ self.assertFalse(console.stderr.closed)
+ kernel.shutdown()
+ self.assertTrue(console.stdout.closed)
+ self.assertTrue(console.stderr.closed)
+
def test_io_pub_thread_stopped(self):
kernel = InternalIPKernel()
kernel.init_ipkernel(gui_backend=None)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/plugins/remote_editor/editor_plugins/emacs/enshell.el new/envisage-4.7.2/envisage/plugins/remote_editor/editor_plugins/emacs/enshell.el
--- old/envisage-4.7.0/envisage/plugins/remote_editor/editor_plugins/emacs/enshell.el 1970-01-01 01:00:00.000000000 +0100
+++ new/envisage-4.7.2/envisage/plugins/remote_editor/editor_plugins/emacs/enshell.el 2019-05-03 11:29:27.000000000 +0200
@@ -0,0 +1 @@
+(pymacs-load "enthought.plugins.remote_editor.communication.client")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/plugins/remote_editor/editor_plugins/emacs/enshell_plugin.py new/envisage-4.7.2/envisage/plugins/remote_editor/editor_plugins/emacs/enshell_plugin.py
--- old/envisage-4.7.0/envisage/plugins/remote_editor/editor_plugins/emacs/enshell_plugin.py 1970-01-01 01:00:00.000000000 +0100
+++ new/envisage-4.7.2/envisage/plugins/remote_editor/editor_plugins/emacs/enshell_plugin.py 2019-05-03 11:29:27.000000000 +0200
@@ -0,0 +1,33 @@
+"""
+"""
+
+# System library imports
+from Pymacs import lisp
+
+# ETS imports
+from envisage.plugins.remote_editor.plugins.editor_plugin import \
+ EditorPlugin
+
+
+client = EditorPlugin()
+client.register()
+
+def run_text():
+ start = lisp.point()
+ end = lisp.mark(True)
+ if start > end:
+ start, end = end, start
+ text = lisp.buffer_substring(start, end)
+ if len(text):
+ client.run_text(text)
+ else:
+ # TODO Complain in message bar
+ pass
+
+def run_file():
+ path = lisp.buffer_file_name()
+ if path is None:
+ # TODO Complain in message bar
+ pass
+ else:
+ client.run_file(path)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/plugins/remote_editor/editor_plugins/readme.txt new/envisage-4.7.2/envisage/plugins/remote_editor/editor_plugins/readme.txt
--- old/envisage-4.7.0/envisage/plugins/remote_editor/editor_plugins/readme.txt 1970-01-01 01:00:00.000000000 +0100
+++ new/envisage-4.7.2/envisage/plugins/remote_editor/editor_plugins/readme.txt 2019-05-03 11:29:27.000000000 +0200
@@ -0,0 +1,4 @@
+The root of this directory contains abstract base classes for plugins.
+
+The subdirectories contain implementations of one or more of these plugins for
+some specific tool which is external to this project.
Binary files old/envisage-4.7.0/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.7.egg and new/envisage-4.7.2/envisage/tests/bad_eggs/acme.bad-0.1a1-py3.7.egg differ
Binary files old/envisage-4.7.0/envisage/tests/eggs/acme.bar-0.1a1-py3.7.egg and new/envisage-4.7.2/envisage/tests/eggs/acme.bar-0.1a1-py3.7.egg differ
Binary files old/envisage-4.7.0/envisage/tests/eggs/acme.baz-0.1a1-py3.7.egg and new/envisage-4.7.2/envisage/tests/eggs/acme.baz-0.1a1-py3.7.egg differ
Binary files old/envisage-4.7.0/envisage/tests/eggs/acme.foo-0.1a1-py3.7.egg and new/envisage-4.7.2/envisage/tests/eggs/acme.foo-0.1a1-py3.7.egg differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/tests/plugin_test_case.py new/envisage-4.7.2/envisage/tests/plugin_test_case.py
--- old/envisage-4.7.0/envisage/tests/plugin_test_case.py 2018-08-10 20:08:30.000000000 +0200
+++ new/envisage-4.7.2/envisage/tests/plugin_test_case.py 2019-05-03 10:28:58.000000000 +0200
@@ -449,6 +449,16 @@
return
+ def test_no_recursion(self):
+ """ Regression test for #119. """
+
+ class PluginA(Plugin):
+ id = 'A'
+ x = ExtensionPoint(List, id='bob')
+
+ application = Application(plugins=[PluginA()])
+ application.get_extensions('bob')
+
# Entry point for stand-alone testing.
if __name__ == '__main__':
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/ui/single_project/DESIGN.txt new/envisage-4.7.2/envisage/ui/single_project/DESIGN.txt
--- old/envisage-4.7.0/envisage/ui/single_project/DESIGN.txt 1970-01-01 01:00:00.000000000 +0100
+++ new/envisage-4.7.2/envisage/ui/single_project/DESIGN.txt 2018-09-10 16:20:43.000000000 +0200
@@ -0,0 +1,47 @@
+These are some design notes for the E3 version of the single_project plugin,
+including a rough background adapated from the README of the E2 single_project
+plugin, and plans for implementing various aspects of the new plugin.
+*Note: This is very much a WIP and will probably be updated/modified heavily
+in a short period of time.
+
+
+BACKGROUND:
+-----------
+This plugin is designed to work with a single project at a time and build
+up 'state' within that project until the user explicitly saves the project.
+
+The plugin contributes two services to an Envisage application -- one for the
+model and one for the UI. Additionally, the plugin contributes a 'Project'
+perspective, 'Project' view, and a number of actions to the UI so that the
+user can create, open, save, save as, and close projects. Finally, it should
+be noted that the plugin manages an indicator applied to the application
+window(s) titlebar as a representation that the current project has unsaved
+modifications.
+
+The current project is visualized by a TreeEditor by default, but the user can
+contribute additional Views. By contributing your own Project factory, the
+user can define your own custom projects.
+
+
+E2 single_projects vs. E3 single_projects:
+-----------------------------------------
+As described by Martin Chilvers:
+ "domain-objects" are at the highest level of abstraction in your design and
+hence are the objects that are understood by the user (e.g. Book, Person, Log,
+LogSuite, Well etc).
+
+The original single_project plugin used resources and resource types to adapt
+domain-objects to add certain behaviours to them that various Envisage plugins
+expected. However, this approach restricted the addition of new behaviours to
+resource types, as well as added a lot of cruft to the process of registering
+new resources/resource types.
+
+The E3 single_project plugin uses Traits Adapters and takes advantage of the new
+ITreeNode interface. The new TreeEditor has been extended to support handling
+unknown domain-objects by adapting them to the ITreeNode interface. An
+ITreeNodeAdapter needs to be defined for any object that you want to be
+displayed in the TreeEditor, such as your Project class and it's sub-nodes.
+The Adapter exposes certain key ITreeNode interface methods, such as
+get_children, when_children_changed, get_lable, etc... This eliminates the
+extra cruft that was necessary in the E2 single_project plugin, such as the
+node monitor, node resource type, etc...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/ui/single_project/README.txt new/envisage-4.7.2/envisage/ui/single_project/README.txt
--- old/envisage-4.7.0/envisage/ui/single_project/README.txt 1970-01-01 01:00:00.000000000 +0100
+++ new/envisage-4.7.2/envisage/ui/single_project/README.txt 2018-09-10 16:20:43.000000000 +0200
@@ -0,0 +1,128 @@
+Last updated: 2006.02.05
+
+
+BACKGROUND:
+-----------
+This plugin is designed to work with a single project at a time and build
+up 'state' within that project until the user explicitly saves the project.
+
+The plugin contributes two services to an Envisage application -- one for the
+model and one for the UI. Additionally, the plugin contributes a 'Project'
+perspective, 'Project' view, and a number of actions to the UI so that the
+user can create, open, save, save as, and close projects. Finally, it should
+be noted that the plugin manages an indicator applied to the application
+window(s) titlebar as a representation that the current project has unsaved
+modifications.
+
+The current project is visualized using a ResourceTree control and thus
+supports all the visualization and interaction customization of resources.
+This also makes makes it easy to build a hierarchy of nodes within the tree
+by implementing the apptools.naming.Context interface.
+
+Finally, this plugin contributes a single extension point which provides the
+capability to define your own custom projects.
+
+
+PRE-REQUISITES:
+---------------
+This plugin requires the use of the envisage framework and the
+following plugins:
+ - envisage.core
+ - envisage.resource
+ - envisage.workbench
+ - envisage.plugins.python_shell
+
+
+HOW TO USE:
+-----------
+This plugin provides a base class for projects but, as of now, that class
+has no capability to contain any data. So for this plugin to be useful within
+an Envisage application you have to complete the following:
+
+- Contribute a project_plugin_definition.FactoryDefinition to the Envisage
+ application. This definition should point to a class derived from
+ project_factory.ProjectFactory which will be used to create new projects
+ as well as handle opening of persisted projects. To do that, your
+ ProjectFactory should override the 'create' and 'open' methods as
+ appropriate to return an instance of a class derived from project.Project.
+ Note that multiple plugins can contribute FactoryDefinitions but only the
+ first contributed definition with the highest priority will be used.
+
+- You will need to derive a class from project.Project which will be used to
+ contain your project's data. This class should:
+ - override the trait_view trait to provide the UI content that will be
+ shown by the plugin (within a wizard dialog) to allow a user to
+ initialize a newly created project.
+ - override the _contains_resource() method so that the plugin can close
+ editors for resources in your project when your project closes.
+ - set the 'dirty' trait to True anytime modifications are made to your
+ project data
+ - optionally override the Project.start() and Project.stop() methods
+ to handle any work needing to be done when a project becomes the
+ current project or is no longer the current project. For example,
+ the base Project uses the stop() method to close any editors associated
+ with resources contained in the project.
+ - optionally override the _load_hook() and _save() methods if you wish
+ to use the base class's infrastructure for loading and saving projects
+ but have additional work that needs to be accomplished during those
+ events. Note that the plugin's UI service calls the save() method and
+ the ProjectFactory calls the load() method.
+ - optionally override the 'load()' and 'save()' methods if you want to
+ completely replace the base class's infrastructure for loading and
+ saving projects. Note that the plugin's UI service calls the save()
+ method and the ProjectFactory calls the load() method.
+
+- You will likely want to register resource types -- and associated classes
+ such as node types, monitors, and resource references -- for the resources
+ that can be contained within your project. This will allow you to take
+ maximum advantage of the infrastructure of the Project view's ResourceTree
+ control. If you do this, you should note that this plugin registers a
+ ProjectResourceType, pointing to a ProjectNodeType, that is used to
+ visualize the root project node. You don't need to derive from these unless
+ you want to customize the resource definition of the project node.
+
+- Another option for implementing the visualization of project contents would
+ be to derive from ProjectView and override the _create_project_control()
+ and _update_project_control() methods to replace the ResourceTree control
+ with some other UI control. If you do the later, you will likely need to
+ create your own project plugin definition but you should be able to reuse
+ almost all of the infrastructure classes contained in this plugin.
+
+- If the resources within your project can be edited in Editors, you should
+ derive Editor classes from ProjectEditor so that the project plugin
+ framework can close these editors when the project closes.
+
+
+KNOWN ISSUES:
+-------------
+- Due to the current capabilities of the workbench plugin, this plugin can't
+ do the ideal closing hook whereby, if the current project is modified, the
+ user gets prompted to save it, close it, or cancel the closing of the window.
+ The best we can do is follow the prompt to close the workbench window with a
+ dialog querying the user whether they want to save the current project or
+ not. There is an Enthought Trac ticket to add the necessary capability to
+ the workbench plugin and this plugin will be 'fixed' shortly thereafter.
+
+- The Project class doesn't support any sort of versioning framework in its
+ saving and loading. This will cause problems as the content and
+ capabilities of projects evolve throughout the software development cycle
+ of an application that uses this plugin.
+
+
+TO-DO:
+------
+- It would be nice if the Project class was modified such that it could
+ actually be used without needing to be derived from. One possibility for
+ this would be to make it a full-fledged folder type Context in and of
+ itself including support for binding and unbinding. If this was done, it
+ should be easy enough to re-use resource types, node types, etc. defined
+ for other Envisage plugins within projects.
+
+- It might be nice if editors that were open when a project was saved were
+ restored when the project was re-loaded. One mechanism to do this would
+ be to modify the Project._editors trait to contain ResourceReferences rather
+ than Resources as the keys. Then when pickling, we would simple dump the
+ editor references and persist just these keys. Upon loading, iterate through
+ the keys/resource references and open an editor for each. One question about
+ this mechanism is that currently we don't track order or position of editors
+ so that info wouldn't be recovered.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/ui/single_project/TODO.txt new/envisage-4.7.2/envisage/ui/single_project/TODO.txt
--- old/envisage-4.7.0/envisage/ui/single_project/TODO.txt 1970-01-01 01:00:00.000000000 +0100
+++ new/envisage-4.7.2/envisage/ui/single_project/TODO.txt 2018-09-10 16:20:43.000000000 +0200
@@ -0,0 +1,9 @@
+To-Do List:
+
+ * Update README and other documentation/examples.
+ * Implement a way to publish the ITreeNodeAdapters so that they don't have to
+ be in the same file as the class which they adapt.
+ * Improve the way we are binding dynamic objects and how they are being
+ retrieved.
+ * Improve the handling of children in the adapters to remove redudancy.
+ * Lots of cleanup left.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/ui/single_project/view/project_view.py new/envisage-4.7.2/envisage/ui/single_project/view/project_view.py
--- old/envisage-4.7.0/envisage/ui/single_project/view/project_view.py 2018-08-10 20:08:30.000000000 +0200
+++ new/envisage-4.7.2/envisage/ui/single_project/view/project_view.py 2019-05-03 11:49:52.000000000 +0200
@@ -12,7 +12,6 @@
# Standard library imports.
import logging
-from string import rfind
# Enthought library imports
from apptools.naming.api import Binding
@@ -262,7 +261,7 @@
# on the new suffix, if any.
name = self.name
if old is not None and len(old) > 0:
- index = rfind(name, " " + old)
+ index = (" " + old).rfind(name)
if index > -1:
name = name[0:index]
if new is not None and len(new) > 0:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage/ui/tasks/tasks_application.py new/envisage-4.7.2/envisage/ui/tasks/tasks_application.py
--- old/envisage-4.7.0/envisage/ui/tasks/tasks_application.py 2018-08-10 20:08:30.000000000 +0200
+++ new/envisage-4.7.2/envisage/ui/tasks/tasks_application.py 2019-05-03 11:49:52.000000000 +0200
@@ -301,8 +301,10 @@
# Create a TaskWindow for each TaskWindowLayout.
for window_layout in window_layouts:
- window = self.create_window(window_layout,
- restore=self.always_use_default_layout)
+ if self.always_use_default_layout:
+ window = self.create_window(window_layout, restore=False)
+ else:
+ window = self.create_window(window_layout, restore=True)
window.open()
def _get_task_factory(self, id):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage.egg-info/PKG-INFO new/envisage-4.7.2/envisage.egg-info/PKG-INFO
--- old/envisage-4.7.0/envisage.egg-info/PKG-INFO 2018-08-15 21:19:04.000000000 +0200
+++ new/envisage-4.7.2/envisage.egg-info/PKG-INFO 2019-05-03 12:38:03.000000000 +0200
@@ -1,13 +1,14 @@
-Metadata-Version: 1.1
+Metadata-Version: 1.2
Name: envisage
-Version: 4.7.0
+Version: 4.7.2
Summary: extensible application framework
Home-page: http://docs.enthought.com/envisage
-Author: ETS Developers
-Author-email: enthought-dev(a)enthought.com
+Author: Martin Chilvers, et. al.
+Author-email: info(a)enthought.com
+Maintainer: ETS Developers
+Maintainer-email: enthought-dev(a)enthought.com
License: BSD
Download-URL: https://github.com/enthought/envisage
-Description-Content-Type: UNKNOWN
Description: ==========================================
envisage: extensible application framework
==========================================
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/envisage.egg-info/SOURCES.txt new/envisage-4.7.2/envisage.egg-info/SOURCES.txt
--- old/envisage-4.7.0/envisage.egg-info/SOURCES.txt 2018-08-15 21:19:04.000000000 +0200
+++ new/envisage-4.7.2/envisage.egg-info/SOURCES.txt 2019-05-03 12:38:04.000000000 +0200
@@ -1,5 +1,9 @@
+CHANGES.txt
+LICENSE.txt
MANIFEST.in
README.rst
+image_LICENSE.txt
+image_LICENSE_CP.txt
setup.py
envisage/__init__.py
envisage/_compat.py
@@ -148,6 +152,7 @@
envisage/plugins/remote_editor/communication/tests/test_communication.py
envisage/plugins/remote_editor/editor_plugins/__init__.py
envisage/plugins/remote_editor/editor_plugins/editor_plugin.py
+envisage/plugins/remote_editor/editor_plugins/readme.txt
envisage/plugins/remote_editor/editor_plugins/editra/__init__.py
envisage/plugins/remote_editor/editor_plugins/editra/editra_plugin.py
envisage/plugins/remote_editor/editor_plugins/editra/start_editra.py
@@ -160,6 +165,9 @@
envisage/plugins/remote_editor/editor_plugins/editra/images/python_runsel_24x24.png
envisage/plugins/remote_editor/editor_plugins/editra/images/python_runsel_32x32.png
envisage/plugins/remote_editor/editor_plugins/editra/images/python_runsel_48x48.png
+envisage/plugins/remote_editor/editor_plugins/emacs/__init__.py
+envisage/plugins/remote_editor/editor_plugins/emacs/enshell.el
+envisage/plugins/remote_editor/editor_plugins/emacs/enshell_plugin.py
envisage/plugins/tasks/__init__.py
envisage/plugins/tasks/python_shell_plugin.py
envisage/plugins/text_editor/__init__.py
@@ -222,24 +230,28 @@
envisage/tests/bad_eggs/acme.bad-0.1a1-py3.4.egg
envisage/tests/bad_eggs/acme.bad-0.1a1-py3.5.egg
envisage/tests/bad_eggs/acme.bad-0.1a1-py3.6.egg
+envisage/tests/bad_eggs/acme.bad-0.1a1-py3.7.egg
envisage/tests/eggs/acme.bar-0.1a1-py2.6.egg
envisage/tests/eggs/acme.bar-0.1a1-py2.7.egg
envisage/tests/eggs/acme.bar-0.1a1-py3.3.egg
envisage/tests/eggs/acme.bar-0.1a1-py3.4.egg
envisage/tests/eggs/acme.bar-0.1a1-py3.5.egg
envisage/tests/eggs/acme.bar-0.1a1-py3.6.egg
+envisage/tests/eggs/acme.bar-0.1a1-py3.7.egg
envisage/tests/eggs/acme.baz-0.1a1-py2.6.egg
envisage/tests/eggs/acme.baz-0.1a1-py2.7.egg
envisage/tests/eggs/acme.baz-0.1a1-py3.3.egg
envisage/tests/eggs/acme.baz-0.1a1-py3.4.egg
envisage/tests/eggs/acme.baz-0.1a1-py3.5.egg
envisage/tests/eggs/acme.baz-0.1a1-py3.6.egg
+envisage/tests/eggs/acme.baz-0.1a1-py3.7.egg
envisage/tests/eggs/acme.foo-0.1a1-py2.6.egg
envisage/tests/eggs/acme.foo-0.1a1-py2.7.egg
envisage/tests/eggs/acme.foo-0.1a1-py3.3.egg
envisage/tests/eggs/acme.foo-0.1a1-py3.4.egg
envisage/tests/eggs/acme.foo-0.1a1-py3.5.egg
envisage/tests/eggs/acme.foo-0.1a1-py3.6.egg
+envisage/tests/eggs/acme.foo-0.1a1-py3.7.egg
envisage/tests/plugins/banana/__init__.py
envisage/tests/plugins/banana/banana_plugin.py
envisage/tests/plugins/banana/plugins.py
@@ -265,6 +277,9 @@
envisage/ui/action/tests/__init__.py
envisage/ui/action/tests/action_manager_builder_test_case.py
envisage/ui/action/tests/dummy_action_manager_builder.py
+envisage/ui/single_project/DESIGN.txt
+envisage/ui/single_project/README.txt
+envisage/ui/single_project/TODO.txt
envisage/ui/single_project/__init__.py
envisage/ui/single_project/api.py
envisage/ui/single_project/default_path_preference_page.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/image_LICENSE.txt new/envisage-4.7.2/image_LICENSE.txt
--- old/envisage-4.7.0/image_LICENSE.txt 1970-01-01 01:00:00.000000000 +0100
+++ new/envisage-4.7.2/image_LICENSE.txt 2018-09-10 16:20:43.000000000 +0200
@@ -0,0 +1,39 @@
+The icons are mostly derived work from other icons. As such they are
+licensed accordingly to the original license:
+
+Project License File
+----------------------------------------------------------------------------
+CP (Crystal Project) LGPL image_LICENSE_CP.txt
+GV (Gael Varoquaux) BSD-like LICENSE.txt
+PSF Python Software Fo. see 1)
+CCL Creative Commons see 2)
+
+Unless stated in this file, icons are the work of Enthought, and are
+released under a 3 clause BSD license.
+
+1) The Python logo is a trademark of the Python Software Foundation.
+ Please refer to: http://www.python.org/psf/trademarks/
+
+2) Creative Commons Attribution ShareAlike license versions
+ 3.0, 2.5, 2.0, and 1.0
+
+
+Files and orginal authors:
+----------------------------------------------------------------------------
+envisage/ui/workbench/images:
+ about.png | PSF
+ application.ico | GV
+
+envisage/ui/workbench/action/images:
+ exit.png | CP
+ preferences.png | CP
+
+examples/workbench/AcmeLab/acme/acmelab/images:
+ about.png | Public domain
+ acmelab.ico | GV
+ splash.jpg | CCL
+
+examples/workbench/AcmeLabUsingEggs/src/acme.acmelab/acme/acmelab/images:
+ about.png | Public domain
+ acmelab.ico | GV
+ splash.jpg | CCL
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/image_LICENSE_CP.txt new/envisage-4.7.2/image_LICENSE_CP.txt
--- old/envisage-4.7.0/image_LICENSE_CP.txt 1970-01-01 01:00:00.000000000 +0100
+++ new/envisage-4.7.2/image_LICENSE_CP.txt 2018-09-10 16:20:43.000000000 +0200
@@ -0,0 +1,351 @@
+License
+
+The Crystal Project are released under LGPL.
+
+GNU General Public License.
+
+ 0. This License Agreement applies to any software library or other program
+ which contains a notice placed by the copyright holder or other
+ authorized party saying it may be distributed under the terms of this
+ Lesser General Public License (also called "this License"). Each
+ licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+ prepared so as to be conveniently linked with application programs
+ (which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work which
+ has been distributed under these terms. A "work based on the Library"
+ means either the Library or any derivative work under copyright law:
+ that is to say, a work containing the Library or a portion of it,
+ either verbatim or with modifications and/or translated
+ straightforwardly into another language. (Hereinafter, translation is
+ included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+ making modifications to it. For a library, complete source code means
+ all the source code for all modules it contains, plus any associated
+ interface definition files, plus the scripts used to control
+ compilation and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+ covered by this License; they are outside its scope. The act of running a
+ program using the Library is not restricted, and output from such a
+ program is covered only if its contents constitute a work based on the
+ Library (independent of the use of the Library in a tool for writing
+ it). Whether that is true depends on what the Library does and what the
+ program that uses the Library does.
+
+
+ 1. You may copy and distribute verbatim copies of the Library's complete
+ source code as you receive it, in any medium, provided that you
+ conspicuously and appropriately publish on each copy an appropriate
+ copyright notice and disclaimer of warranty; keep intact all the notices
+ that refer to this License and to the absence of any warranty; and
+ distribute a copy of this License along with the Library.
+
+ You may charge a fee for the physical act of transferring a copy, and
+ you may at your option offer warranty protection in exchange for a fee.
+
+
+ 2. You may modify your copy or copies of the Library or any portion of it,
+ thus forming a work based on the Library, and copy and distribute such
+ modifications or work under the terms of Section 1 above, provided that
+ you also meet all of these conditions:
+
+ a. The modified work must itself be a software library.
+
+ b. You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c. You must cause the whole of the work to be licensed at no charge
+ to all third parties under the terms of this License.
+
+ d. If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses the
+ facility, other than as an argument passed when the facility is
+ invoked, then you must make a good faith effort to ensure that, in
+ the event an application does not supply such function or table,
+ the facility still operates, and performs whatever part of its
+ purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has a
+ purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must be
+ optional: if the application does not supply it, the square root
+ function must still compute square roots.)
+
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the Library, and
+ can be reasonably considered independent and separate works in
+ themselves, then this License, and its terms, do not apply to those
+ sections when you distribute them as separate works. But when you
+ distribute the same sections as part of a whole which is a work based on
+ the Library, the distribution of the whole must be on the terms of this
+ License, whose permissions for other licensees extend to the entire
+ whole, and thus to each and every part regardless of who wrote it.
+
+ Thus, it is not the intent of this section to claim rights or contest
+ your rights to work written entirely by you; rather, the intent is to
+ exercise the right to control the distribution of derivative or
+ collective works based on the Library.
+
+ In addition, mere aggregation of another work not based on the Library
+ with the Library (or with a work based on the Library) on a volume of a
+ storage or distribution medium does not bring the other work under the
+ scope of this License.
+
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+ License instead of this License to a given copy of the Library. To do
+ this, you must alter all the notices that refer to this License, so that
+ they refer to the ordinary GNU General Public License, version 2,
+ instead of to this License. (If a newer version than version 2 of the
+ ordinary GNU General Public License has appeared, then you can specify
+ that version instead if you wish.) Do not make any other change in these
+ notices.
+
+ Once this change is made in a given copy, it is irreversible for that
+ copy, so the ordinary GNU General Public License applies to all
+ subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of the
+ Library into a program that is not a library.
+
+
+ 4. You may copy and distribute the Library (or a portion or derivative of
+ it, under Section 2) in object code or executable form under the terms
+ of Sections 1 and 2 above provided that you accompany it with the
+ complete corresponding machine-readable source code, which must be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy from a
+ designated place, then offering equivalent access to copy the source code
+ from the same place satisfies the requirement to distribute the source
+ code, even though third parties are not compelled to copy the source along
+ with the object code.
+
+
+ 5. A program that contains no derivative of any portion of the Library, but
+ is designed to work with the Library by being compiled or linked with
+ it, is called a "work that uses the Library". Such a work, in isolation,
+ is not a derivative work of the Library, and therefore falls outside the
+ scope of this License.
+
+ However, linking a "work that uses the Library" with the Library creates
+ an executable that is a derivative of the Library (because it contains
+ portions of the Library), rather than a "work that uses the
+ library". The executable is therefore covered by this License. Section 6
+ states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+ that is part of the Library, the object code for the work may be a
+ derivative work of the Library even though the source code is
+ not. Whether this is true is especially significant if the work can be
+ linked without the Library, or if the work is itself a library. The
+ threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data structure
+ layouts and accessors, and small macros and small inline functions (ten
+ lines or less in length), then the use of the object file is
+ unrestricted, regardless of whether it is legally a derivative
+ work. (Executables containing this object code plus portions of the
+ Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+ distribute the object code for the work under the terms of Section 6. Any
+ executables containing that work also fall under Section 6, whether or not
+ they are linked directly with the Library itself.
+
+
+ 6. As an exception to the Sections above, you may also combine or link a
+ "work that uses the Library" with the Library to produce a work
+ containing portions of the Library, and distribute that work under terms
+ of your choice, provided that the terms permit modification of the work
+ for the customer's own use and reverse engineering for debugging such
+ modifications.
+
+ You must give prominent notice with each copy of the work that the
+ Library is used in it and that the Library and its use are covered by
+ this License. You must supply a copy of this License. If the work during
+ execution displays copyright notices, you must include the copyright
+ notice for the Library among them, as well as a reference directing the
+ user to the copy of this License. Also, you must do one of these things:
+
+ a. Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that uses
+ the Library", as object code and/or source code, so that the user
+ can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood that
+ the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.) .
+
+ b. Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c. Accompany the work with a written offer, valid for at least three
+ years, to give the same user the materials specified in Subsection
+ 6a, above, for a charge no more than the cost of performing this
+ distribution.
+
+ d. If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e. Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the Library"
+ must include any data and utility programs needed for reproducing the
+ executable from it. However, as a special exception, the materials to be
+ distributed need not include anything that is normally distributed (in
+ either source or binary form) with the major components (compiler,
+ kernel, and so on) of the operating system on which the executable runs,
+ unless that component itself accompanies the executable.
+
+ It may happen that this requirement contradicts the license restrictions
+ of other proprietary libraries that do not normally accompany the
+ operating system. Such a contradiction means you cannot use both them
+ and the Library together in an executable that you distribute.
+
+
+ 7. You may place library facilities that are a work based on the Library
+ side-by-side in a single library together with other library facilities
+ not covered by this License, and distribute such a combined library,
+ provided that the separate distribution of the work based on the Library
+ and of the other library facilities is otherwise permitted, and provided
+ that you do these two things:
+
+ a. Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities. This
+ must be distributed under the terms of the Sections above.
+
+ b. Give prominent notice with the combined library of the fact that
+ part of it is a work based on the Library, and explaining where to
+ find the accompanying uncombined form of the same work.
+
+
+ 8. You may not copy, modify, sublicense, link with, or distribute the
+ Library except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense, link with, or distribute the
+ Library is void, and will automatically terminate your rights under this
+ License. However, parties who have received copies, or rights, from you
+ under this License will not have their licenses terminated so long as
+ such parties remain in full compliance.
+
+
+ 9. You are not required to accept this License, since you have not signed
+ it. However, nothing else grants you permission to modify or distribute
+ the Library or its derivative works. These actions are prohibited by law
+ if you do not accept this License. Therefore, by modifying or
+ distributing the Library (or any work based on the Library), you
+ indicate your acceptance of this License to do so, and all its terms and
+ conditions for copying, distributing or modifying the Library or works
+ based on it.
+
+
+ 10. Each time you redistribute the Library (or any work based on the
+ Library), the recipient automatically receives a license from the
+ original licensor to copy, distribute, link with or modify the Library
+ subject to these terms and conditions. You may not impose any further
+ restrictions on the recipients' exercise of the rights granted
+ herein. You are not responsible for enforcing compliance by third
+ parties with this License.
+
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent issues),
+ conditions are imposed on you (whether by court order, agreement or
+ otherwise) that contradict the conditions of this License, they do not
+ excuse you from the conditions of this License. If you cannot distribute
+ so as to satisfy simultaneously your obligations under this License and
+ any other pertinent obligations, then as a consequence you may not
+ distribute the Library at all. For example, if a patent license would
+ not permit royalty-free redistribution of the Library by all those who
+ receive copies directly or indirectly through you, then the only way you
+ could satisfy both it and this License would be to refrain entirely from
+ distribution of the Library.
+
+ If any portion of this section is held invalid or unenforceable under
+ any particular circumstance, the balance of the section is intended to
+ apply, and the section as a whole is intended to apply in other
+ circumstances.
+
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of any
+ such claims; this section has the sole purpose of protecting the
+ integrity of the free software distribution system which is implemented
+ by public license practices. Many people have made generous
+ contributions to the wide range of software distributed through that
+ system in reliance on consistent application of that system; it is up to
+ the author/donor to decide if he or she is willing to distribute
+ software through any other system and a licensee cannot impose that
+ choice.
+
+ This section is intended to make thoroughly clear what is believed to be
+ a consequence of the rest of this License.
+
+
+ 12. If the distribution and/or use of the Library is restricted in certain
+ countries either by patents or by copyrighted interfaces, the original
+ copyright holder who places the Library under this License may add an
+ explicit geographical distribution limitation excluding those countries,
+ so that distribution is permitted only in or among countries not thus
+ excluded. In such case, this License incorporates the limitation as if
+ written in the body of this License.
+
+
+ 13. The Free Software Foundation may publish revised and/or new versions of
+ the Lesser General Public License from time to time. Such new versions
+ will be similar in spirit to the present version, but may differ in
+ detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the Library
+ specifies a version number of this License which applies to it and "any
+ later version", you have the option of following the terms and conditions
+ either of that version or of any later version published by the Free
+ Software Foundation. If the Library does not specify a license version
+ number, you may choose any version ever published by the Free Software
+ Foundation.
+
+
+ 14. If you wish to incorporate parts of the Library into other free programs
+ whose distribution conditions are incompatible with these, write to the
+ author to ask for permission. For software which is copyrighted by the
+ Free Software Foundation, write to the Free Software Foundation; we
+ sometimes make exceptions for this. Our decision will be guided by the
+ two goals of preserving the free status of all derivatives of our free
+ software and of promoting the sharing and reuse of software generally.
+
+ No Warranty
+
+ 15. Because the library is licensed free of charge, there is no warranty for
+ the library, to the extent permitted by applicable law. Except when
+ otherwise stated in writing the copyright holders and/or other parties
+ provide the library "as is" without warranty of any kind, either expressed
+ or implied, including, but not limited to, the implied warranties of
+ merchantability and fitness for a particular purpose. The entire risk as
+ to the quality and performance of the library is with you. Should the
+ library prove defective, you assume the cost of all necessary servicing,
+ repair or correction.
+
+ 16. In no event unless required by applicable law or agreed to in writing
+ will any copyright holder, or any other party who may modify and/or
+ redistribute the library as permitted above, be liable to you for
+ damages, including any general, special, incidental or consequential
+ damages arising out of the use or inability to use the library
+ (including but not limited to loss of data or data being rendered
+ inaccurate or losses sustained by you or third parties or a failure of
+ the library to operate with any other software), even if such holder or
+ other party has been advised of the possibility of such damages.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/envisage-4.7.0/setup.py new/envisage-4.7.2/setup.py
--- old/envisage-4.7.0/setup.py 2018-08-13 18:36:23.000000000 +0200
+++ new/envisage-4.7.2/setup.py 2019-05-03 12:06:44.000000000 +0200
@@ -8,9 +8,9 @@
MAJOR = 4
MINOR = 7
-MICRO = 0
+MICRO = 2
-IS_RELEASED = True
+IS_RELEASED = True
VERSION = '%d.%d.%d' % (MAJOR, MINOR, MICRO)
@@ -153,12 +153,21 @@
install_requires = __requires__,
license = "BSD",
packages = find_packages(),
- package_data = {'': ['images/*', '*.ini',],
- 'envisage.tests': ['bad_eggs/*.egg',
- 'eggs/*.egg',
- 'plugins/pear/*.py',
- 'plugins/banana/*.py',
- 'plugins/orange/*.py']},
+ package_data = {
+ '': ['images/*', '*.ini'],
+ 'envisage.tests': [
+ 'bad_eggs/*.egg',
+ 'eggs/*.egg',
+ 'plugins/pear/*.py',
+ 'plugins/banana/*.py',
+ 'plugins/orange/*.py',
+ ],
+ 'envisage.ui.single_project': [
+ '*.txt',
+ ],
+ 'envisage.plugins.remote_editor.editor_plugins': ["*.txt"],
+ 'envisage.plugins.remote_editor.editor_plugins.emacs': ["*.el"],
+ },
platforms = ["Windows", "Linux", "Mac OS-X", "Unix", "Solaris"],
zip_safe = False,
)
1
0
Hello community,
here is the log from the commit of package python-regex for openSUSE:Factory checked in at 2019-05-15 12:34:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-regex (Old)
and /work/SRC/openSUSE:Factory/.python-regex.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-regex"
Wed May 15 12:34:14 2019 rev:4 rq:702916 version:2019.04.14
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-regex/python-regex.changes 2018-07-06 10:41:03.283321907 +0200
+++ /work/SRC/openSUSE:Factory/.python-regex.new.5148/python-regex.changes 2019-05-15 12:34:15.716556719 +0200
@@ -1,0 +2,6 @@
+Tue May 14 17:26:10 UTC 2019 - Tomáš Chvátal <tchvatal(a)suse.com>
+
+- Update to 2019.04.14:
+ * no upstream changelog provided
+
+-------------------------------------------------------------------
Old:
----
regex-2018.06.21.tar.gz
New:
----
regex-2019.04.14.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-regex.spec ++++++
--- /var/tmp/diff_new_pack.1QSF3b/_old 2019-05-15 12:34:16.220555268 +0200
+++ /var/tmp/diff_new_pack.1QSF3b/_new 2019-05-15 12:34:16.224555256 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-regex
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -12,20 +12,22 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-regex
-Version: 2018.06.21
+Version: 2019.04.14
Release: 0
Summary: Alternative regular expression module for Python
License: Python-2.0
Group: Development/Languages/Python
-Url: https://bitbucket.org/mrabarnett/mrab-regex
+URL: https://bitbucket.org/mrabarnett/mrab-regex
Source: https://files.pythonhosted.org/packages/source/r/regex/regex-%{version}.tar…
BuildRequires: %{python_module devel}
+BuildRequires: %{python_module setuptools}
+BuildRequires: fdupes
BuildRequires: python-rpm-macros
BuildRequires: python3-testsuite
%python_subpackages
@@ -50,14 +52,14 @@
%install
%python_install
+%python_expand %fdupes %{buildroot}%{$python_sitearch}
%check
-%{python_expand PYTHONPATH=%{buildroot}%{$python_sitearch}
-$python -B %{buildroot}%{$python_sitearch}/test_regex.py
+%{python_expand export PYTHONPATH=%{buildroot}%{$python_sitearch}
+$python -B %{buildroot}%{$python_sitearch}/regex/test/test_regex.py
}
%files %{python_files}
-%defattr(-,root,root)
%doc README
%doc docs/*
%{python_sitearch}/*
++++++ regex-2018.06.21.tar.gz -> regex-2019.04.14.tar.gz ++++++
++++ 106106 lines of diff (skipped)
1
0
Hello community,
here is the log from the commit of package python-nose2 for openSUSE:Factory checked in at 2019-05-15 12:34:11
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-nose2 (Old)
and /work/SRC/openSUSE:Factory/.python-nose2.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-nose2"
Wed May 15 12:34:11 2019 rev:4 rq:702904 version:0.9.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-nose2/python-nose2.changes 2019-04-08 20:53:47.442579569 +0200
+++ /work/SRC/openSUSE:Factory/.python-nose2.new.5148/python-nose2.changes 2019-05-15 12:34:12.652565544 +0200
@@ -1,0 +2,6 @@
+Tue May 14 17:02:07 UTC 2019 - Tomáš Chvátal <tchvatal(a)suse.com>
+
+- Add patch to fix build with new mock versions:
+ * fix-mock-dep.patch
+
+-------------------------------------------------------------------
New:
----
fix-mock-dep.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-nose2.spec ++++++
--- /var/tmp/diff_new_pack.QBgHjZ/_old 2019-05-15 12:34:13.348563540 +0200
+++ /var/tmp/diff_new_pack.QBgHjZ/_new 2019-05-15 12:34:13.352563529 +0200
@@ -26,6 +26,7 @@
URL: https://github.com/nose-devs/nose2
Source: https://files.pythonhosted.org/packages/source/n/nose2/nose2-%{version}.tar…
Patch0: remove_unittest2.patch
+Patch1: fix-mock-dep.patch
BuildRequires: %{python_module cov-core >= 1.12}
BuildRequires: %{python_module mock}
BuildRequires: %{python_module setuptools}
++++++ fix-mock-dep.patch ++++++
Index: nose2-0.9.1/setup.py
===================================================================
--- nose2-0.9.1.orig/setup.py
+++ nose2-0.9.1/setup.py
@@ -32,7 +32,7 @@ setup(
# mock on py2, py3.4 and py3.5
# not just py2: py3 versions of mock don't all have the same
# interface and this can cause issues
- 'mock==2.0.0;python_version<"3.6"',
+ 'mock>=2.0.0;python_version<"3.6"',
],
extras_require={
"coverage_plugin": ["coverage>=4.4.1"],
1
0