openSUSE Commits
Threads by month
- ----- 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
February 2015
- 1 participants
- 1390 discussions
Hello community,
here is the log from the commit of package python-sqlalchemy-migrate for openSUSE:Factory checked in at 2015-02-25 02:18:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-sqlalchemy-migrate (Old)
and /work/SRC/openSUSE:Factory/.python-sqlalchemy-migrate.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-sqlalchemy-migrate"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-sqlalchemy-migrate/python-sqlalchemy-migrate.changes 2014-09-17 17:27:28.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-sqlalchemy-migrate.new/python-sqlalchemy-migrate.changes 2015-02-25 02:18:37.000000000 +0100
@@ -1,0 +2,10 @@
+Tue Feb 24 13:22:05 UTC 2015 - tbechtold(a)suse.com
+
+- update to version 0.9.4:
+ * Remove svn version tag setting
+ * Ignore transaction management statements in SQL scripts
+ * Use native sqlalchemy 0.9 quote attribute with ibmdb2
+ * Don't add warnings filter on import
+ * pep8: mark all pep8 checks that currently fail as ignored
+
+-------------------------------------------------------------------
Old:
----
sqlalchemy-migrate-0.9.2.tar.gz
New:
----
sqlalchemy-migrate-0.9.4.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-sqlalchemy-migrate.spec ++++++
--- /var/tmp/diff_new_pack.BCrh6T/_old 2015-02-25 02:18:38.000000000 +0100
+++ /var/tmp/diff_new_pack.BCrh6T/_new 2015-02-25 02:18:38.000000000 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-sqlalchemy-migrate
#
-# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
# Copyright 2011 LISA GmbH, Bingen, Germany.
#
# All modifications and additions to the file contributed by third parties
@@ -18,7 +18,7 @@
Name: python-sqlalchemy-migrate
-Version: 0.9.2
+Version: 0.9.4
Release: 0
Summary: Database schema migration for SQLAlchemy
License: MIT
++++++ sqlalchemy-migrate-0.9.2.tar.gz -> sqlalchemy-migrate-0.9.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sqlalchemy-migrate-0.9.2/AUTHORS new/sqlalchemy-migrate-0.9.4/AUTHORS
--- old/sqlalchemy-migrate-0.9.2/AUTHORS 2014-09-11 18:42:29.000000000 +0200
+++ new/sqlalchemy-migrate-0.9.4/AUTHORS 2015-01-13 02:35:52.000000000 +0100
@@ -1,5 +1,6 @@
Alex Favaro <alexfav619(a)gmail.com>
Bob Farrell <robertanthonyfarrell(a)gmail.com>
+Brant Knudson <bknudson(a)us.ibm.com>
Chris Withers <chris(a)simplistix.co.uk>
Cyril Roelandt <cyril.roelandt(a)enovance.com>
Dan Prince <dprince(a)redhat.com>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sqlalchemy-migrate-0.9.2/ChangeLog new/sqlalchemy-migrate-0.9.4/ChangeLog
--- old/sqlalchemy-migrate-0.9.2/ChangeLog 2014-09-11 18:42:29.000000000 +0200
+++ new/sqlalchemy-migrate-0.9.4/ChangeLog 2015-01-13 02:35:52.000000000 +0100
@@ -1,12 +1,26 @@
CHANGES
=======
+0.9.4
+-----
+
+* Remove svn version tag setting
+
+0.9.3
+-----
+
+* Ignore transaction management statements in SQL scripts
+* Use native sqlalchemy 0.9 quote attribute with ibmdb2
+* Don't add warnings filter on import
+* pep8: mark all pep8 checks that currently fail as ignored
+
0.9.2
-----
* SqlScript: execute multiple statements one by one
* Make sure we don't throw away exception on SQL script failure
* Pin testtools to < 0.9.36
+* Fix ibmdb2 unique constraint handling for sqlalchemy 0.9
0.9.1
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sqlalchemy-migrate-0.9.2/PKG-INFO new/sqlalchemy-migrate-0.9.4/PKG-INFO
--- old/sqlalchemy-migrate-0.9.2/PKG-INFO 2014-09-11 18:42:29.000000000 +0200
+++ new/sqlalchemy-migrate-0.9.4/PKG-INFO 2015-01-13 02:35:52.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: sqlalchemy-migrate
-Version: 0.9.2
+Version: 0.9.4
Summary: Database schema migration for SQLAlchemy
Home-page: http://www.openstack.org/
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sqlalchemy-migrate-0.9.2/migrate/changeset/__init__.py new/sqlalchemy-migrate-0.9.4/migrate/changeset/__init__.py
--- old/sqlalchemy-migrate-0.9.2/migrate/changeset/__init__.py 2014-09-11 18:41:48.000000000 +0200
+++ new/sqlalchemy-migrate-0.9.4/migrate/changeset/__init__.py 2015-01-13 02:35:13.000000000 +0100
@@ -5,13 +5,10 @@
.. [#] SQL Data Definition Language
"""
import re
-import warnings
import sqlalchemy
from sqlalchemy import __version__ as _sa_version
-warnings.simplefilter('always', DeprecationWarning)
-
_sa_version = tuple(int(re.match("\d+", x).group(0)) for x in _sa_version.split("."))
SQLA_07 = _sa_version >= (0, 7)
SQLA_08 = _sa_version >= (0, 8)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sqlalchemy-migrate-0.9.2/migrate/changeset/databases/ibmdb2.py new/sqlalchemy-migrate-0.9.4/migrate/changeset/databases/ibmdb2.py
--- old/sqlalchemy-migrate-0.9.2/migrate/changeset/databases/ibmdb2.py 2014-09-11 18:41:48.000000000 +0200
+++ new/sqlalchemy-migrate-0.9.4/migrate/changeset/databases/ibmdb2.py 2015-01-13 02:35:13.000000000 +0100
@@ -14,6 +14,7 @@
from migrate.changeset import ansisql
from migrate.changeset import constraint
+from migrate.changeset import util
from migrate import exceptions
@@ -107,7 +108,8 @@
"""Rename a table; #38. Other ops aren't supported."""
self._rename_table(table)
- self.append("TO %s" % self.preparer.quote(table.new_name, table.quote))
+ q = util.safe_quote(table)
+ self.append("TO %s" % self.preparer.quote(table.new_name, q))
self.execute()
self.append("COMMIT")
self.execute()
@@ -128,10 +130,11 @@
def _run_subvisit(self, delta, func, start_alter=True):
"""Runs visit method based on what needs to be changed on column"""
table = delta.table
+ q = util.safe_quote(table)
if start_alter:
self.start_alter_table(table)
ret = func(table,
- self.preparer.quote(delta.current_name, delta.quote),
+ self.preparer.quote(delta.current_name, q),
delta)
self.execute()
self._reorg_table(self.preparer.format_table(delta.table))
@@ -262,13 +265,13 @@
if (isinstance(constraint, UniqueConstraint) and
is_unique_constraint_with_null_columns_supported(
self.dialect)):
- for column in constraint.columns._all_cols:
+ for column in constraint:
if column.nullable:
constraint.exclude_nulls = True
break
if getattr(constraint, 'exclude_nulls', None):
index = Index(constraint.name,
- *(column for column in constraint.columns._all_cols),
+ *(column for column in constraint),
unique=True)
sql = self.process(CreateIndex(index))
sql += ' EXCLUDE NULL KEYS'
@@ -285,7 +288,7 @@
if (isinstance(constraint, UniqueConstraint) and
is_unique_constraint_with_null_columns_supported(
self.dialect)):
- for column in constraint.columns._all_cols:
+ for column in constraint:
if column.nullable:
constraint.exclude_nulls = True
break
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sqlalchemy-migrate-0.9.2/migrate/tests/versioning/test_script.py new/sqlalchemy-migrate-0.9.4/migrate/tests/versioning/test_script.py
--- old/sqlalchemy-migrate-0.9.2/migrate/tests/versioning/test_script.py 2014-09-11 18:41:49.000000000 +0200
+++ new/sqlalchemy-migrate-0.9.4/migrate/tests/versioning/test_script.py 2015-01-13 02:35:13.000000000 +0100
@@ -271,3 +271,25 @@
sqls = SqlScript(src)
sqls.run(self.engine)
tmp_sql_table.metadata.drop_all(self.engine, checkfirst=True)
+
+ @fixture.usedb()
+ def test_transaction_management_statements(self):
+ """
+ Test that we can successfully execute SQL scripts with transaction
+ management statements.
+ """
+ for script_pattern in (
+ "BEGIN TRANSACTION; %s; COMMIT;",
+ "BEGIN; %s; END TRANSACTION;",
+ ):
+
+ test_statement = ("CREATE TABLE TEST1 (field1 int); "
+ "DROP TABLE TEST1")
+ script = script_pattern % test_statement
+ src = self.tmp()
+
+ with open(src, 'wt') as f:
+ f.write(script)
+
+ sqls = SqlScript(src)
+ sqls.run(self.engine)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sqlalchemy-migrate-0.9.2/migrate/tests/versioning/test_shell.py new/sqlalchemy-migrate-0.9.4/migrate/tests/versioning/test_shell.py
--- old/sqlalchemy-migrate-0.9.2/migrate/tests/versioning/test_shell.py 2014-09-11 18:41:48.000000000 +0200
+++ new/sqlalchemy-migrate-0.9.4/migrate/tests/versioning/test_shell.py 2015-01-13 02:35:13.000000000 +0100
@@ -485,7 +485,6 @@
result = self.env.run('migrate compare_model_to_db %s %s --model=%s' \
% (self.url, repos_path, model_module.replace(":", ".")), expect_error=True)
self.assertEqual(result.returncode, 0)
- self.assertTrue("DeprecationWarning" in result.stderr)
self.assertTrue("tables missing from database: tmp_account_rundiffs" in result.stdout)
# Update db to latest model.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sqlalchemy-migrate-0.9.2/migrate/versioning/script/sql.py new/sqlalchemy-migrate-0.9.4/migrate/versioning/script/sql.py
--- old/sqlalchemy-migrate-0.9.2/migrate/versioning/script/sql.py 2014-09-11 18:41:49.000000000 +0200
+++ new/sqlalchemy-migrate-0.9.4/migrate/versioning/script/sql.py 2015-01-13 02:35:13.000000000 +0100
@@ -1,6 +1,7 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import logging
+import re
import shutil
import sqlparse
@@ -36,13 +37,29 @@
try:
trans = conn.begin()
try:
+ # ignore transaction management statements that are
+ # redundant in SQL script context and result in
+ # operational error being returned.
+ #
+ # Note: we don't ignore ROLLBACK in migration scripts
+ # since its usage would be insane anyway, and we're
+ # better to fail on its occurance instead of ignoring it
+ # (and committing transaction, which is contradictory to
+ # the whole idea of ROLLBACK)
+ ignored_statements = ('BEGIN', 'END', 'COMMIT')
+ ignored_regex = re.compile('^\s*(%s).*;?$' % '|'.join(ignored_statements),
+ re.IGNORECASE)
+
# NOTE(ihrachys): script may contain multiple statements, and
# not all drivers reliably handle multistatement queries or
# commands passed to .execute(), so split them and execute one
# by one
for statement in sqlparse.split(text):
if statement:
- conn.execute(statement)
+ if re.match(ignored_regex, statement):
+ log.warning('"%s" found in SQL script; ignoring' % statement)
+ else:
+ conn.execute(statement)
trans.commit()
except Exception as e:
log.error("SQL script %s failed: %s", self.path, e)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sqlalchemy-migrate-0.9.2/setup.cfg new/sqlalchemy-migrate-0.9.4/setup.cfg
--- old/sqlalchemy-migrate-0.9.2/setup.cfg 2014-09-11 18:42:29.000000000 +0200
+++ new/sqlalchemy-migrate-0.9.4/setup.cfg 2015-01-13 02:35:52.000000000 +0100
@@ -32,7 +32,7 @@
source-dir = doc/source
[egg_info]
-tag_svn_revision = 0
tag_build =
+tag_svn_revision = 0
tag_date = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sqlalchemy-migrate-0.9.2/sqlalchemy_migrate.egg-info/PKG-INFO new/sqlalchemy-migrate-0.9.4/sqlalchemy_migrate.egg-info/PKG-INFO
--- old/sqlalchemy-migrate-0.9.2/sqlalchemy_migrate.egg-info/PKG-INFO 2014-09-11 18:42:29.000000000 +0200
+++ new/sqlalchemy-migrate-0.9.4/sqlalchemy_migrate.egg-info/PKG-INFO 2015-01-13 02:35:52.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: sqlalchemy-migrate
-Version: 0.9.2
+Version: 0.9.4
Summary: Database schema migration for SQLAlchemy
Home-page: http://www.openstack.org/
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sqlalchemy-migrate-0.9.2/sqlalchemy_migrate.egg-info/SOURCES.txt new/sqlalchemy-migrate-0.9.4/sqlalchemy_migrate.egg-info/SOURCES.txt
--- old/sqlalchemy-migrate-0.9.2/sqlalchemy_migrate.egg-info/SOURCES.txt 2014-09-11 18:42:29.000000000 +0200
+++ new/sqlalchemy-migrate-0.9.4/sqlalchemy_migrate.egg-info/SOURCES.txt 2015-01-13 02:35:52.000000000 +0100
@@ -126,5 +126,6 @@
sqlalchemy_migrate.egg-info/dependency_links.txt
sqlalchemy_migrate.egg-info/entry_points.txt
sqlalchemy_migrate.egg-info/not-zip-safe
+sqlalchemy_migrate.egg-info/pbr.json
sqlalchemy_migrate.egg-info/requires.txt
sqlalchemy_migrate.egg-info/top_level.txt
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sqlalchemy-migrate-0.9.2/sqlalchemy_migrate.egg-info/pbr.json new/sqlalchemy-migrate-0.9.4/sqlalchemy_migrate.egg-info/pbr.json
--- old/sqlalchemy-migrate-0.9.2/sqlalchemy_migrate.egg-info/pbr.json 1970-01-01 01:00:00.000000000 +0100
+++ new/sqlalchemy-migrate-0.9.4/sqlalchemy_migrate.egg-info/pbr.json 2015-01-13 02:35:52.000000000 +0100
@@ -0,0 +1 @@
+{"is_release": true, "git_version": "b011e6c"}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sqlalchemy-migrate-0.9.2/sqlalchemy_migrate.egg-info/requires.txt new/sqlalchemy-migrate-0.9.4/sqlalchemy_migrate.egg-info/requires.txt
--- old/sqlalchemy-migrate-0.9.2/sqlalchemy_migrate.egg-info/requires.txt 2014-09-11 18:42:29.000000000 +0200
+++ new/sqlalchemy-migrate-0.9.4/sqlalchemy_migrate.egg-info/requires.txt 2015-01-13 02:35:52.000000000 +0100
@@ -3,4 +3,4 @@
decorator
six>=1.4.1
sqlparse
-Tempita >= 0.4
\ No newline at end of file
+Tempita >= 0.4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sqlalchemy-migrate-0.9.2/tox.ini new/sqlalchemy-migrate-0.9.4/tox.ini
--- old/sqlalchemy-migrate-0.9.2/tox.ini 2014-09-11 18:41:48.000000000 +0200
+++ new/sqlalchemy-migrate-0.9.4/tox.ini 2015-01-13 02:35:13.000000000 +0100
@@ -75,12 +75,51 @@
python setup.py testr --slowest --testr-args='{posargs}'
[flake8]
-# F841 local variable 'json_template' is assigned to but never used
+# E121 continuation line indentation is not a multiple of four
+# E122 continuation line missing indentation or outdented
+# E123 closing bracket does not match indentation of opening bracket's line
+# E124 closing bracket does not match visual indentation
+# E125 continuation line does not distinguish itself from next logical line
+# E126 continuation line over-indented for hanging indent
+# E127 continuation line over-indented for visual indent
+# E128 continuation line under-indented for visual indent
+# E202 whitespace before ')'
+# E203 whitespace before ','
+# E225 missing whitespace around operator
+# E226 missing whitespace around arithmetic operator
+# E228 missing whitespace around modulo operator
+# E231 missing whitespace after ','
+# H234 assertEquals is deprecated, use assertEqual
+# E251 unexpected spaces around keyword / parameter equals
+# E261 at least two spaces before inline comment
+# E272 multiple spaces before keyword
+# E301 expected 1 blank line, found 0
+# E302 expected 2 blank lines, found 1
+# E303 too many blank lines (3)
+# E401 multiple imports on one line
+# E501 line too long (<number-of-chars> > 79 characters)
+# E502 the backslash is redundant between brackets
+# E702 multiple statements on one line (semicolon)
+# E712 comparison to True should be 'if cond is True:' or 'if cond:'
+# F401 '<module>' imported but unused
+# F403 'from migrate.exceptions import *' used; unable to detect undefined names
+# F811 redefinition of unused '<type>' from line <lineno>
+# F821 undefined name '<name>'
+# F841 local variable '<variable>' is assigned to but never used
+# H101 Use TODO(NAME)
# H201 no 'except:' at least use 'except Exception:'
-# H302 import only modules.'bla..' does not import a module
+# H202 assertRaises Exception too broad
+# H233 Python 3.x incompatible use of print operator
+# H301 one import per line
+# H302 import only modules. '<import>' does not import a module
# H306 imports not in alphabetical order
+# H401 docstring should not start with a space
+# H402 one line docstring needs punctuation.
+# H403 multi line docstring end on new line
# H404 multi line docstring should start with a summary
-ignore = F841,H201,H302,H306,H404
+# H501 Do not use locals() for string formatting
+# W391 blank line at end of file
+ignore = E121,E122,E123,E124,E125,E126,E127,E128,E202,E203,E225,E226,E228,E231,E251,E261,E272,E301,E302,E303,E401,E501,E502,E702,E712,F401,F403,F811,F821,F841,H101,H201,H202,H233,H234,H301,H302,H306,H401,H402,H403,H404,H501,W391
show-source = true
builtins = _
exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,tools,build
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package python-requests for openSUSE:Factory checked in at 2015-02-25 02:18:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-requests (Old)
and /work/SRC/openSUSE:Factory/.python-requests.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-requests"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-requests/python-requests.changes 2014-12-03 22:48:59.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.python-requests.new/python-requests.changes 2015-02-25 02:18:36.000000000 +0100
@@ -1,0 +2,119 @@
+Tue Feb 24 13:04:17 UTC 2015 - tbechtold(a)suse.com
+
+- update to 2.5.2:
+ * Update HISTORY and version for v2.5.2
+ * Update urllib3 to 29aa09bde9c42cc9a8d79aac47ee3d362b438cca
+ * document combination of repeated response headers
+ * Update README to use Shields badges
+ * Upgrade urllib3 to 490d3a227fadb626cd54a240b9d0922f849914b4
+ * Update certificate bundle.
+ * Update to use readthedocs.org instead of rtfd.org
+ * add a timeout value to connection_error_invalid_port test to accelerate
+ failure
+ * split test_connection_error into two distinct tests, and changed
+ "unknown url" test URL since fooobarbangbazbing.httpbin.org currently gives
+ a valid response.
+ * quickstart: using a list as a value in query params
+ * HISTORY: replace n-dash to workaround pip bug
+ * Check that a filename is a basestring instance
+ * Move noncebit to the only place it is used
+ * Remove entirely unnecessary and unused bits from requests.compat
+ * Attempt to quote anyway if unquoting fails
+ * Update urllib3 to a27758625e4169330fcf965652b1093faf5aaaa2
+ * drawn towards it rather than pushed away
+ * certifi
+ * simpler button
+ * cleanups
+ * Requests Pro
+ * javascripts
+ * Changing year in all copyright information
+ * Enhance documentation for clarity.
+ * Clean up cookie docs and display them.
+ * Bump version to 2.5.1
+ * Add release notes for 2.5.1
+ * Fix bug in renegotiating a nonce with the server
+ * Fix error handling on Python 3
+ * catch exception more specifically in Response.ok
+ * Uncommented test in test_requests.py
+ * Fix a typo in a comment
+ * Give proper attribution to pip
+ * utils.guess_filename fails if the given parameter looks like a file object
+ but has a non-string name attribute
+ * Copy pip's import machinery wholesale
+ * Updated the broken link to twitter streaming API documentation
+ * Enable GitHub syntax highlighting on README
+ * Bump version to 2.5.0
+ * Add updates for 2.5.0
+ * Update tests to work offline
+ * updatee chardet, urllib3
+ * url was already parsed, don't urlparse twice
+ * Properly serialize RecentlyUsedContainers for cache
+ * Changed ConnectionError to InvalidURL
+ * Docs: Add more section labels for referencing
+ * Partially addresses Issue #1572
+ * Update HTTPAdapter docstring
+ * Add last few changes and add a quick test
+ * Update urllib3 to df4ec5cce1
+ * Update how we handle retries to be consistent with documentation
+ * Fix HTTPDigestAuth not to treat non-file as a file
+ * Fixed.
+ * Added test for overriding Content-Length.
+ * Close sessions created in the functional API
+ * Pass strict to urllib3.
+ * Use to_native_string instead of builtin_str
+ * Update documentation about max_retries to reflect code
+ * Cap the redirect_cache size to prevent memory abuse
+ * Add DeprecationWarnings to inform users of plans
+ * Note about read timeout errors and max_retries
+ * fix failing test "test_prepare_unicode_url" \(take 3\)
+ * Revert "fix failing test "test_prepare_unicode_url""
+ * fix failing test "test_prepare_unicode_url"
+ * Revert "fix failing test "test_prepare_unicode_url""
+ * update AUTHORS
+ * fix failing test "test_prepare_unicode_url"
+ * Changing parameter name `newline` ==> `delimiter`.
+ * Clean up handle_redirect.
+ * Adding a custom line delimiter to iter_lines()
+ * Fix #2279. Update layout css
+ * Fix #2288. Change urllib3 and chardet workflow
+ * Update sidebarintro.html
+ * Made more better
+ * Add Release History to the sidebar
+ * Fixed #2250
+ * Update utils.py
+ * Clean up, support all redirects, fix potential endless 401 loop.
+ * v2.4.3
+ * Re-order params for backwards compat
+ * allow unicode URLs on Python 2
+ * requests v2.4.2
+ * fix documentation for utils.get_unicode_from_response() :)
+ * v2.4.2 changelog
+ * Remove timeout from __attrs__
+ * Fix a couple of issues I noticed
+ * Support bytestring URLs on Python 3.x
+ * A fix for #1979 repeat HTTP digest authentication after redirect.
+ * remove unused import
+ * fix #2247
+ * docs: Clarify how to pass a custom set of CAs
+ * Correct redirection introduction
+ * Avoid getting stuck in a loop
+ * make StreamConsumedError doubly inherit
+ * using the `StreamConsumedError`
+ * add-in StreamConsumedError
+ * rm `else` after `if` then `raise` block
+ * raise RuntimeError when a single streamed request calls *iter methods
+ than once
+ * Remove invoke from requirements.txt, docs
+ * Fixup the remaining references to timeline.json.
+ * Moved multiple files upload example to advanced section.
+ * Added example of how to send multiple files in one request.
+ * Document skipping in PreparedRequest; followup to #2222
+ * Add more tests to `test_invalid_url`
+ * lawl
+ * mils
+ * Fixes typo in test
+ * Changes check on base and json. Fails on tests.
+ * Adds review changes
+ * Adds json parameter for POST requests
+
+-------------------------------------------------------------------
Old:
----
requests-2.4.1.tar.gz
New:
----
requests-2.5.2.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-requests.spec ++++++
--- /var/tmp/diff_new_pack.CSGSBm/_old 2015-02-25 02:18:37.000000000 +0100
+++ /var/tmp/diff_new_pack.CSGSBm/_new 2015-02-25 02:18:37.000000000 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-requests
#
-# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2015 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
@@ -17,7 +17,7 @@
Name: python-requests
-Version: 2.4.1
+Version: 2.5.2
Release: 0
Url: http://python-requests.org
Summary: Awesome Python HTTP Library That's Actually Usable
++++++ requests-2.4.1.tar.gz -> requests-2.5.2.tar.gz ++++++
++++ 4680 lines of diff (skipped)
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package python-eventlet for openSUSE:Factory checked in at 2015-02-25 02:18:10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-eventlet (Old)
and /work/SRC/openSUSE:Factory/.python-eventlet.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-eventlet"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-eventlet/python-eventlet.changes 2015-02-03 11:40:40.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.python-eventlet.new/python-eventlet.changes 2015-02-25 02:18:35.000000000 +0100
@@ -1,0 +2,13 @@
+Tue Feb 24 11:12:59 UTC 2015 - tbechtold(a)suse.com
+
+- update to version 0.17.0
+ * Full Python3 compatibility
+ * greendns: IPv6 support, improved handling of /etc/hosts
+ * tpool: make sure we return results during killall
+ * semaphore: Don't hog a semaphore if someone else is waiting for it
+ * green.socket: create_connection() was wrapping all exceptions
+ in socket.error
+ * Make sure SSL retries are done using the exact same data buffer
+ * greenio: shutdown already closed sockets without error
+
+-------------------------------------------------------------------
Old:
----
eventlet-0.16.1.tar.gz
New:
----
eventlet-0.17.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-eventlet.spec ++++++
--- /var/tmp/diff_new_pack.tFuDYV/_old 2015-02-25 02:18:36.000000000 +0100
+++ /var/tmp/diff_new_pack.tFuDYV/_new 2015-02-25 02:18:36.000000000 +0100
@@ -17,7 +17,7 @@
Name: python-eventlet
-Version: 0.16.1
+Version: 0.17.0
Release: 0
Url: http://eventlet.net
Summary: Highly concurrent networking library
++++++ eventlet-0.16.1.tar.gz -> eventlet-0.17.0.tar.gz ++++++
++++ 4464 lines of diff (skipped)
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package jsoncpp for openSUSE:Factory checked in at 2015-02-25 02:18:08
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/jsoncpp (Old)
and /work/SRC/openSUSE:Factory/.jsoncpp.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "jsoncpp"
Changes:
--------
--- /work/SRC/openSUSE:Factory/jsoncpp/jsoncpp.changes 2015-02-18 12:09:29.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.jsoncpp.new/jsoncpp.changes 2015-02-25 02:18:34.000000000 +0100
@@ -1,0 +2,10 @@
+Tue Feb 24 14:10:36 UTC 2015 - mpluskal(a)suse.com
+
+- Update to 1.4.4
+ * The odd allowDroppedNullPlaceholders feature of Readers
+ (corresponding to dropNullPlaceholders in Writers) can be
+ helpful when parsing javascript as JSON, when null elements
+ have been discarded.
+- Build doc package as noarch
+
+-------------------------------------------------------------------
Old:
----
1.4.2.tar.gz
New:
----
1.4.4.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ jsoncpp.spec ++++++
--- /var/tmp/diff_new_pack.DkzkbB/_old 2015-02-25 02:18:35.000000000 +0100
+++ /var/tmp/diff_new_pack.DkzkbB/_new 2015-02-25 02:18:35.000000000 +0100
@@ -17,7 +17,7 @@
Name: jsoncpp
-Version: 1.4.2
+Version: 1.4.4
Release: 0
Summary: C++ library that allows manipulating with JSON
License: MIT
@@ -58,6 +58,7 @@
%package doc
Summary: Documentation for %{name}
Group: Documentation
+BuildArch: noarch
%description doc
JSON is a lightweight data-interchange format. It can represent numbers,
@@ -112,7 +113,6 @@
%doc AUTHORS LICENSE NEWS.txt README.md
%{_libdir}/pkgconfig/%{name}.pc
%{_libdir}/lib%{name}.so
-
%{_includedir}/json/
%files doc
++++++ 1.4.2.tar.gz -> 1.4.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jsoncpp-1.4.2/amalgamate.py new/jsoncpp-1.4.4/amalgamate.py
--- old/jsoncpp-1.4.2/amalgamate.py 2015-02-15 10:01:26.000000000 +0100
+++ new/jsoncpp-1.4.4/amalgamate.py 2015-02-19 22:37:57.000000000 +0100
@@ -59,7 +59,7 @@
print("Amalgating header...")
header = AmalgamationFile(source_top_dir)
header.add_text("/// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/)")
- header.add_text("/// It is intented to be used with #include <%s>" % header_include_path)
+ header.add_text('/// It is intended to be used with #include "%s"' % header_include_path)
header.add_file("LICENSE", wrap_in_comment=True)
header.add_text("#ifndef JSON_AMALGATED_H_INCLUDED")
header.add_text("# define JSON_AMALGATED_H_INCLUDED")
@@ -85,7 +85,7 @@
print("Amalgating forward header...")
header = AmalgamationFile(source_top_dir)
header.add_text("/// Json-cpp amalgated forward header (http://jsoncpp.sourceforge.net/)")
- header.add_text("/// It is intented to be used with #include <%s>" % forward_header_include_path)
+ header.add_text('/// It is intended to be used with #include "%s"' % forward_header_include_path)
header.add_text("/// This header provides forward declaration for all JsonCpp types.")
header.add_file("LICENSE", wrap_in_comment=True)
header.add_text("#ifndef JSON_FORWARD_AMALGATED_H_INCLUDED")
@@ -105,10 +105,15 @@
print("Amalgating source...")
source = AmalgamationFile(source_top_dir)
source.add_text("/// Json-cpp amalgated source (http://jsoncpp.sourceforge.net/)")
- source.add_text("/// It is intented to be used with #include <%s>" % header_include_path)
+ source.add_text('/// It is intended to be used with #include "%s"' % header_include_path)
source.add_file("LICENSE", wrap_in_comment=True)
source.add_text("")
- source.add_text("#include <%s>" % header_include_path)
+ source.add_text('#include "%s"' % header_include_path)
+ source.add_text("""
+#ifndef JSON_IS_AMALGAMATION
+#error "Compile with -I PATH_TO_JSON_DIRECTORY"
+#endif
+""")
source.add_text("")
lib_json = "src/lib_json"
source.add_file(os.path.join(lib_json, "json_tool.h"))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jsoncpp-1.4.2/include/json/assertions.h new/jsoncpp-1.4.4/include/json/assertions.h
--- old/jsoncpp-1.4.2/include/json/assertions.h 2015-02-15 10:01:26.000000000 +0100
+++ new/jsoncpp-1.4.4/include/json/assertions.h 2015-02-19 22:37:57.000000000 +0100
@@ -16,7 +16,7 @@
#if JSON_USE_EXCEPTION
#include <stdexcept>
#define JSON_ASSERT(condition) \
- assert(condition); // @todo <= change this into an exception throw
+ if (!(condition)) {throw std::runtime_error( "assert json failed" );} // @todo <= add detail about condition in exception
#define JSON_FAIL_MESSAGE(message) do{std::ostringstream oss; oss << message; throw std::runtime_error(oss.str());}while(0)
//#define JSON_FAIL_MESSAGE(message) throw std::runtime_error(message)
#else // JSON_USE_EXCEPTION
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jsoncpp-1.4.2/include/json/version.h new/jsoncpp-1.4.4/include/json/version.h
--- old/jsoncpp-1.4.2/include/json/version.h 2015-02-15 10:01:26.000000000 +0100
+++ new/jsoncpp-1.4.4/include/json/version.h 2015-02-19 22:37:57.000000000 +0100
@@ -4,10 +4,10 @@
#ifndef JSON_VERSION_H_INCLUDED
# define JSON_VERSION_H_INCLUDED
-# define JSONCPP_VERSION_STRING "1.4.2"
+# define JSONCPP_VERSION_STRING "1.4.4"
# define JSONCPP_VERSION_MAJOR 1
# define JSONCPP_VERSION_MINOR 4
-# define JSONCPP_VERSION_PATCH 2
+# define JSONCPP_VERSION_PATCH 4
# define JSONCPP_VERSION_QUALIFIER
# define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | (JSONCPP_VERSION_PATCH << 8))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jsoncpp-1.4.2/src/lib_json/json_reader.cpp new/jsoncpp-1.4.4/src/lib_json/json_reader.cpp
--- old/jsoncpp-1.4.2/src/lib_json/json_reader.cpp 2015-02-15 10:01:26.000000000 +0100
+++ new/jsoncpp-1.4.4/src/lib_json/json_reader.cpp 2015-02-19 22:37:57.000000000 +0100
@@ -200,6 +200,8 @@
}
break;
case tokenArraySeparator:
+ case tokenObjectEnd:
+ case tokenArrayEnd:
if (features_.allowDroppedNullPlaceholders_) {
// "Un-read" the current token and mark the current value as a null
// token.
@@ -209,8 +211,7 @@
currentValue().setOffsetStart(current_ - begin_ - 1);
currentValue().setOffsetLimit(current_ - begin_);
break;
- }
- // Else, fall through...
+ } // Else, fall through...
default:
currentValue().setOffsetStart(token.start_ - begin_);
currentValue().setOffsetLimit(token.end_ - begin_);
@@ -1160,6 +1161,8 @@
}
break;
case tokenArraySeparator:
+ case tokenObjectEnd:
+ case tokenArrayEnd:
if (features_.allowDroppedNullPlaceholders_) {
// "Un-read" the current token and mark the current value as a null
// token.
@@ -1169,8 +1172,7 @@
currentValue().setOffsetStart(current_ - begin_ - 1);
currentValue().setOffsetLimit(current_ - begin_);
break;
- }
- // Else, fall through...
+ } // else, fall through ...
default:
currentValue().setOffsetStart(token.start_ - begin_);
currentValue().setOffsetLimit(token.end_ - begin_);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jsoncpp-1.4.2/src/test_lib_json/main.cpp new/jsoncpp-1.4.4/src/test_lib_json/main.cpp
--- old/jsoncpp-1.4.2/src/test_lib_json/main.cpp 2015-02-15 10:01:26.000000000 +0100
+++ new/jsoncpp-1.4.4/src/test_lib_json/main.cpp 2015-02-19 22:37:57.000000000 +0100
@@ -1862,6 +1862,158 @@
delete reader;
}
+struct CharReaderAllowDropNullTest : JsonTest::TestCase {};
+
+JSONTEST_FIXTURE(CharReaderAllowDropNullTest, issue178) {
+ Json::CharReaderBuilder b;
+ b.settings_["allowDroppedNullPlaceholders"] = true;
+ Json::Value root;
+ std::string errs;
+ Json::CharReader* reader(b.newCharReader());
+ {
+ char const doc[] = "{\"a\":,\"b\":true}";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
+ JSONTEST_ASSERT_EQUAL(2u, root.size());
+ JSONTEST_ASSERT_EQUAL(Json::nullValue, root.get("a", true));
+ }
+ {
+ char const doc[] = "{\"a\":}";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
+ JSONTEST_ASSERT_EQUAL(1u, root.size());
+ JSONTEST_ASSERT_EQUAL(Json::nullValue, root.get("a", true));
+ }
+ {
+ char const doc[] = "[]";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT(errs == "");
+ JSONTEST_ASSERT_EQUAL(0u, root.size());
+ JSONTEST_ASSERT_EQUAL(Json::arrayValue, root);
+ }
+ {
+ char const doc[] = "[null]";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT(errs == "");
+ JSONTEST_ASSERT_EQUAL(1u, root.size());
+ }
+ {
+ char const doc[] = "[,]";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
+ JSONTEST_ASSERT_EQUAL(2u, root.size());
+ }
+ {
+ char const doc[] = "[,,,]";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
+ JSONTEST_ASSERT_EQUAL(4u, root.size());
+ }
+ {
+ char const doc[] = "[null,]";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
+ JSONTEST_ASSERT_EQUAL(2u, root.size());
+ }
+ {
+ char const doc[] = "[,null]";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT(errs == "");
+ JSONTEST_ASSERT_EQUAL(2u, root.size());
+ }
+ {
+ char const doc[] = "[,,]";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
+ JSONTEST_ASSERT_EQUAL(3u, root.size());
+ }
+ {
+ char const doc[] = "[null,,]";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
+ JSONTEST_ASSERT_EQUAL(3u, root.size());
+ }
+ {
+ char const doc[] = "[,null,]";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
+ JSONTEST_ASSERT_EQUAL(3u, root.size());
+ }
+ {
+ char const doc[] = "[,,null]";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT(errs == "");
+ JSONTEST_ASSERT_EQUAL(3u, root.size());
+ }
+ {
+ char const doc[] = "[[],,,]";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
+ JSONTEST_ASSERT_EQUAL(4u, root.size());
+ JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[0u]);
+ }
+ {
+ char const doc[] = "[,[],,]";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT_STRING_EQUAL("", errs);
+ JSONTEST_ASSERT_EQUAL(4u, root.size());
+ JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[1u]);
+ }
+ {
+ char const doc[] = "[,,,[]]";
+ bool ok = reader->parse(
+ doc, doc + std::strlen(doc),
+ &root, &errs);
+ JSONTEST_ASSERT(ok);
+ JSONTEST_ASSERT(errs == "");
+ JSONTEST_ASSERT_EQUAL(4u, root.size());
+ JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[3u]);
+ }
+ delete reader;
+}
+
struct IteratorTest : JsonTest::TestCase {};
JSONTEST_FIXTURE(IteratorTest, distance) {
@@ -1925,6 +2077,8 @@
JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterArray);
JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterBool);
+ JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowDropNullTest, issue178);
+
JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, distance);
return runner.runCommandLine(argc, argv);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jsoncpp-1.4.2/version new/jsoncpp-1.4.4/version
--- old/jsoncpp-1.4.2/version 2015-02-15 10:01:26.000000000 +0100
+++ new/jsoncpp-1.4.4/version 2015-02-19 22:37:57.000000000 +0100
@@ -1 +1 @@
-1.4.2
+1.4.4
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package openwsman for openSUSE:Factory checked in at 2015-02-25 02:18:06
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/openwsman (Old)
and /work/SRC/openSUSE:Factory/.openwsman.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openwsman"
Changes:
--------
--- /work/SRC/openSUSE:Factory/openwsman/openwsman.changes 2015-01-29 09:56:45.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.openwsman.new/openwsman.changes 2015-02-25 02:18:32.000000000 +0100
@@ -1,0 +2,10 @@
+Tue Feb 24 14:03:47 UTC 2015 - kkaempf(a)suse.com
+
+- Update to 2.4.14
+ - Features
+ - Improved C++ bindings (Peter Hatina)
+ - Bugfixes
+ - Build fixes for Fedora21, RHEL7, and CentOS7
+ - option parser accepts '-?' and '--help' as valid
+
+-------------------------------------------------------------------
Old:
----
openwsman-2.4.13.tar.bz2
New:
----
openwsman-2.4.14.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ openwsman.spec ++++++
--- /var/tmp/diff_new_pack.4JumtC/_old 2015-02-25 02:18:33.000000000 +0100
+++ /var/tmp/diff_new_pack.4JumtC/_new 2015-02-25 02:18:33.000000000 +0100
@@ -122,7 +122,7 @@
%endif
Requires(pre): sed coreutils grep /bin/hostname
-Version: 2.4.13
+Version: 2.4.14
Release: 0
# Mandriva:
# Release %mkrel 1
++++++ openwsman-2.4.13.tar.bz2 -> openwsman-2.4.14.tar.bz2 ++++++
++++ 2174 lines of diff (skipped)
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package mksusecd for openSUSE:Factory checked in at 2015-02-25 02:18:04
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/mksusecd (Old)
and /work/SRC/openSUSE:Factory/.mksusecd.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "mksusecd"
Changes:
--------
--- /work/SRC/openSUSE:Factory/mksusecd/mksusecd.changes 2015-02-10 20:24:11.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.mksusecd.new/mksusecd.changes 2015-02-25 02:18:30.000000000 +0100
@@ -1,0 +2,8 @@
+Tue Feb 24 14:26:13 CET 2015 - snwint(a)suse.com
+
+- support initrds with pre-sle12 key management
+- support adding driver updates to initrd
+- no-sign option should also prevent updating 'content' file
+- 1.13
+
+-------------------------------------------------------------------
Old:
----
mksusecd-1.12.tar.xz
New:
----
mksusecd-1.13.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ mksusecd.spec ++++++
--- /var/tmp/diff_new_pack.EmpKt8/_old 2015-02-25 02:18:31.000000000 +0100
+++ /var/tmp/diff_new_pack.EmpKt8/_new 2015-02-25 02:18:31.000000000 +0100
@@ -29,7 +29,7 @@
Summary: Create SUSE Linux installation ISOs
License: GPL-3.0+
Group: Hardware/Other
-Version: 1.12
+Version: 1.13
Release: 0
Source: %{name}-%{version}.tar.xz
Url: https://github.com/wfeldt/mksusecd
++++++ mksusecd-1.12.tar.xz -> mksusecd-1.13.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mksusecd-1.12/VERSION new/mksusecd-1.13/VERSION
--- old/mksusecd-1.12/VERSION 2015-02-10 10:02:57.000000000 +0100
+++ new/mksusecd-1.13/VERSION 2015-02-24 14:20:20.000000000 +0100
@@ -1 +1 @@
-1.12
+1.13
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mksusecd-1.12/changelog new/mksusecd-1.13/changelog
--- old/mksusecd-1.12/changelog 2015-02-10 10:02:57.000000000 +0100
+++ new/mksusecd-1.13/changelog 2015-02-24 14:20:20.000000000 +0100
@@ -1,3 +1,8 @@
+2015-02-24: 1.13
+ - support initrds with pre-sle12 key management
+ - support adding driver updates to initrd
+ - no-sign option should also prevent updating 'content' file
+
2015-02-10: 1.12
- simplify key handling
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mksusecd-1.12/mksusecd new/mksusecd-1.13/mksusecd
--- old/mksusecd-1.12/mksusecd 2015-02-10 10:02:57.000000000 +0100
+++ new/mksusecd-1.13/mksusecd 2015-02-24 14:20:20.000000000 +0100
@@ -157,8 +157,10 @@
sub find_magic;
sub meta_iso;
sub meta_fat;
+sub get_unpack_commands;
sub create_initrd;
sub update_initrd;
+sub extract_installkeys;
sub create_cd_ikr;
sub isolinux_add_option;
sub grub2_add_option;
@@ -285,6 +287,7 @@
my $has_efi = 0;
my $sign_key_pub;
my $sign_key_dir;
+my $initrd_installkeys;
my $progress_start = 0;
my $progress_end = 100;
@@ -326,6 +329,7 @@
$boot = analyze_boot;
update_boot_options;
if($opt_sign && (@opt_initrds || update_content)) {
+ extract_installkeys;
create_sign_key;
add_sign_key;
}
@@ -431,7 +435,8 @@
image (partitioning tools don't really like this) or
'iso' or 'fat' in which case you get a regular partition
with an ISO960 or FAT file system (default: 'iso').
- --initrd DIR|RPM Add directory DIR or package RPM to initrd.
+ --initrd DIR|RPM|DUD Add directory DIR or package RPM or driver update DUD
+ to initrd.
--no-docs Don't include package documentation when updating the
initrd (default).
--keep-docs Include package documentation when updating initrd.
@@ -849,11 +854,11 @@
$cmd = "$mkisofs->{command}$mkisofs->{options}";
- print "running:\n$cmd\n" if $opt_verbose >= 1;
+ print "running:\n$cmd\n" if $opt_verbose >= 2;
- print "$mkisofs->{command} sort file:\n", join("\n", @{$mkisofs->{sort}}), "\n" if $opt_verbose >= 2;
+ print "$mkisofs->{command} sort file:\n", join("\n", @{$mkisofs->{sort}}), "\n" if $opt_verbose >= 3;
- print "$mkisofs->{command} exclude file:\n", join("\n", @{$mkisofs->{exclude}}), "\n" if $opt_verbose >= 2;
+ print "$mkisofs->{command} exclude file:\n", join("\n", @{$mkisofs->{exclude}}), "\n" if $opt_verbose >= 3;
if(open my $fh, "$cmd 2>&1 |") {
$| = 1;
@@ -874,7 +879,7 @@
$ok = 0 if $?;
}
- print $log if $opt_verbose >= 2 || !$ok;
+ print $log if $opt_verbose >= 3 || !$ok;
die "Error: $mkisofs->{command} failed\n" if !$ok;
}
@@ -1363,6 +1368,46 @@
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+sub get_unpack_commands
+{
+ my $i = $_[0];
+ my $tmp_dir = $_[1];
+
+ my ($cmd1, $cmd2);
+
+ my $t = `file -b -k -L $i 2>/dev/null`;
+
+ if(-d $i) {
+ $cmd1 = "tar -C '$i' -cf - .";
+ $cmd2 = 'tar';
+ }
+ elsif(-f $i && $t =~ /^RPM/) {
+ $cmd1 = "rpm2cpio '$i'";
+ $cmd2 = 'cpio';
+ }
+ elsif(-f $i && $t =~ / (cpio|tar) archive/) {
+ $cmd1 = "cat '$i'";
+ $cmd2 = $1;
+ }
+ elsif(-f $i && $t =~ /^(gzip|XZ) compressed data/) {
+ $cmd1 = "\L$1\E -dc '$i'";
+ my $z = `$cmd1 | file -b -`;
+ $cmd2 = $1 if $z =~ / (cpio|tar) archive/;
+ }
+
+ if($cmd1 && $cmd2) {
+ $cmd2 = "( cd $tmp_dir ; cpio --quiet --sparse -dimu --no-absolute-filenames 2>/dev/null )" if $cmd2 eq 'cpio';
+ $cmd2 = "tar -C $tmp_dir -xpf - 2>/dev/null" if $cmd2 eq 'tar';
+
+ # print "$cmd1 | $cmd2\n";
+ return [ $cmd1, $cmd2 ];
+ }
+
+ return undef;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sub create_initrd
{
return undef if !@opt_initrds;
@@ -1371,12 +1416,10 @@
my $tmp_dir = $tmp->dir();
for my $i (@opt_initrds) {
- my $t = `file -b -k -L $i 2>/dev/null`;
- if(-d $i) {
- system "tar -C '$i' -cf - . | tar -C $tmp_dir -xpf -";
- }
- elsif(-f $i && $t =~ /^RPM/) {
- system "rpm2cpio '$i' | ( cd $tmp_dir ; cpio --quiet --sparse -dimu --no-absolute-filenames )";
+ my $cmds = get_unpack_commands $i, $tmp_dir;
+
+ if($cmds) {
+ system join(' | ', @$cmds);
}
else {
print STDERR "Warning: ignoring $i\n";
@@ -1395,7 +1438,7 @@
print "initrd: linuxrc detected, renamed to /init\n";
}
- system "( cd $tmp_dir; find . | cpio --quiet -o -H newc | gzip -9c ) >> $tmp_initrd";
+ system "( cd $tmp_dir; find . | cpio --quiet -o -H newc --owner 0:0 | gzip -9c ) >> $tmp_initrd";
# system "ls -lR $tmp_dir";
@@ -1421,6 +1464,31 @@
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+sub extract_installkeys
+{
+ return if !$opt_sign;
+
+ for my $b (sort keys %$boot) {
+ if($boot->{$b}{initrd}) {
+ my $f = fname($boot->{$b}{initrd});
+ if(-f $f) {
+ my $tmp_dir = $tmp->dir();
+ my $cmds = get_unpack_commands $f, $tmp_dir;
+ if($cmds) {
+ system join(' | ', @$cmds);
+ if(-f "$tmp_dir/installkey.gpg") {
+ $initrd_installkeys = "$tmp_dir/installkey.gpg";
+ print "old style initrd found\n" if $opt_verbose >= 1;
+ }
+ }
+ }
+ last;
+ }
+ }
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sub create_cd_ikr
{
local $_;
@@ -1717,6 +1785,9 @@
{
my $changed = 0;
+ # don't modify content if we're not going to re-sign it
+ return $changed if !$opt_sign;
+
my $content = fname "content";
return unless defined $content;
@@ -1847,8 +1918,17 @@
my $tmp_dir = $tmp->dir();
- system "mkdir -p $tmp_dir/usr/lib/rpm/gnupg/keys";
- system "cp $sign_key_pub $tmp_dir/usr/lib/rpm/gnupg/keys";
+ if($initrd_installkeys) {
+ # old style, gpg key ring
+ system "cp $initrd_installkeys $tmp_dir/installkey.gpg";
+ system "gpg --homedir=$sign_key_dir --batch --no-default-keyring --ignore-time-conflict --ignore-valid-from --keyring $tmp_dir/installkey.gpg --import $sign_key_pub 2>/dev/null";
+ unlink "$tmp_dir/installkey.gpg~";
+ }
+ else {
+ # new style, directory of gpg keys
+ system "mkdir -p $tmp_dir/usr/lib/rpm/gnupg/keys";
+ system "cp $sign_key_pub $tmp_dir/usr/lib/rpm/gnupg/keys";
+ }
print "signing key added to initrd\n" if $opt_verbose >= 1;
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package python-html2text for openSUSE:Factory checked in at 2015-02-25 02:18:02
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-html2text (Old)
and /work/SRC/openSUSE:Factory/.python-html2text.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-html2text"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-html2text/python-html2text.changes 2013-10-29 09:33:39.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.python-html2text.new/python-html2text.changes 2015-02-25 02:18:29.000000000 +0100
@@ -0,0 +1,8 @@
+Sun Feb 8 06:16:02 UTC 2015 - arun(a)gmx.de
+
+- specfile:
+ * update copyright year
+ * removed installation of .py file in /usr/bin; An upstream mistake
+ and a conflict betwenn html2text.py in python_sitelib and in
+ bindir when an external project tries to import it.
+
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-html2text.spec ++++++
--- /var/tmp/diff_new_pack.6nkXUM/_old 2015-02-25 02:18:30.000000000 +0100
+++ /var/tmp/diff_new_pack.6nkXUM/_new 2015-02-25 02:18:30.000000000 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-html2text
#
-# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -47,11 +47,13 @@
%install
python setup.py install --prefix=%{_prefix} --root=%{buildroot}
+# An upstream mistake. A conflict betwenn html2text.py in python_sitelib
+# and in bindir when an external project tries to import it
+rm %{buildroot}%{_bindir}/html2text.py
%files
%defattr(-,root,root,-)
%doc COPYING README.md
-%{_bindir}/html2text.py
%{python_sitelib}/*
%changelog
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package python-pecan for openSUSE:Factory checked in at 2015-02-25 02:17:57
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pecan (Old)
and /work/SRC/openSUSE:Factory/.python-pecan.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pecan"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pecan/python-pecan.changes 2014-11-11 10:15:59.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.python-pecan.new/python-pecan.changes 2015-02-25 02:18:26.000000000 +0100
@@ -1,0 +2,40 @@
+Tue Feb 24 12:49:00 UTC 2015 - tbechtold(a)suse.com
+
+- update to 0.8.3
+ *Properly* detect Python < 3.3.
+ * Fix py32 support; importlib.machinery.SourceFileLoader doesn't exist until
+ py33
+ * Version increment.
+ * Change pecan to more gracefully handle a few odd request encoding edge
+ cases.
+ * Document pecan.request.context
+ * Improve ImportError verbosity for configuration files.
+ * core: optimize renderer computing
+ * middleware.static: remove useless stored variable
+ * Version increment.
+ * Don't clone pecan-dependent projects from cgit.
+ * Allows multiple parameters to be converted to list
+ * tox: pass posargs to test command
+ * Corrects ouptut -> output in docs/source/hooks.rst
+ * Add documentation for generic REST controllers.
+ * Version increment.
+ * Improve detection of infinite recursion for PecanHook and pypy.
+ * Fix broken wsme-stable tests and remove some deprecated pip flags.
+ * Fix typo in description
+ * Only define remainder when not empty
+ * Fixes expose of staticmethod
+ * Version increment.
+ * Resolve a bug that mixes up argument order for generic functions.
+ * Fix a routing bug for generic subcontrollers.
+ * Remove `assert` for flow control; it can be optimized away with `python -O`.
+ * For HTTP POSTs, map JSON request bodies to controller keyword arguments.
+ * Improve argspec detection and leniency for wrapped controllers.
+ * When path arguments are incorrect for RestController, return HTTP 404, not
+ 400.
+ * When detecting non-content for HTTP 204, properly catch UnicodeDecodeError.
+ * Fix a bug in generic function handling when context locals are disabled.
+ * Stop using distribute for Python 3 tests.
+ * Revert "Import run_cross_tests.sh from oslo-incubator"
+ * Add docs environment to tox.ini
+
+-------------------------------------------------------------------
Old:
----
pecan-0.7.0.tar.gz
New:
----
pecan-0.8.3.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pecan.spec ++++++
--- /var/tmp/diff_new_pack.oJdSjz/_old 2015-02-25 02:18:27.000000000 +0100
+++ /var/tmp/diff_new_pack.oJdSjz/_new 2015-02-25 02:18:27.000000000 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-pecan
#
-# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2015 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
@@ -17,7 +17,7 @@
Name: python-pecan
-Version: 0.7.0
+Version: 0.8.3
Release: 0
Summary: A WSGI object-dispatching web framework, designed to be lean and fast
License: BSD-3-Clause
@@ -44,7 +44,7 @@
Requires: python-Mako >= 0.4.0
Requires: python-WebOb >= 1.2dev
Requires: python-WebTest >= 1.3.1
-Requires: python-logutils
+Requires: python-logutils >= 0.3
Requires: python-singledispatch
Requires: python-six
Suggests: python-Jinja2
++++++ pecan-0.7.0.tar.gz -> pecan-0.8.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/PKG-INFO new/pecan-0.8.3/PKG-INFO
--- old/pecan-0.7.0/PKG-INFO 2014-08-29 14:51:16.000000000 +0200
+++ new/pecan-0.8.3/PKG-INFO 2015-01-12 23:57:54.000000000 +0100
@@ -1,7 +1,7 @@
Metadata-Version: 1.1
Name: pecan
-Version: 0.7.0
-Summary: A WSGI object-dispatching web framework, designed to be lean and fast, with few dependancies.
+Version: 0.8.3
+Summary: A WSGI object-dispatching web framework, designed to be lean and fast, with few dependencies.
Home-page: http://github.com/stackforge/pecan
Author: Jonathan LaCour
Author-email: info(a)pecanpy.org
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/commands/base.py new/pecan-0.8.3/pecan/commands/base.py
--- old/pecan-0.7.0/pecan/commands/base.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/commands/base.py 2015-01-12 23:57:45.000000000 +0100
@@ -46,7 +46,7 @@
continue
try:
cmd = ep.load()
- assert hasattr(cmd, 'run')
+ cmd.run # ensure existance; catch AttributeError otherwise
except Exception as e: # pragma: nocover
warn("Unable to load plugin %s: %s" % (ep, e), RuntimeWarning)
continue
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/commands/create.py new/pecan-0.8.3/pecan/commands/create.py
--- old/pecan-0.7.0/pecan/commands/create.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/commands/create.py 2015-01-12 23:57:45.000000000 +0100
@@ -22,7 +22,7 @@
log.debug('%s loading scaffold %s', self.__class__.__name__, ep)
try:
cmd = ep.load()
- assert hasattr(cmd, 'copy_to')
+ cmd.copy_to # ensure existance; catch AttributeError otherwise
except Exception as e: # pragma: nocover
warn(
"Unable to load scaffold %s: %s" % (ep, e), RuntimeWarning
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/configuration.py new/pecan-0.8.3/pecan/configuration.py
--- old/pecan-0.7.0/pecan/configuration.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/configuration.py 2015-01-12 23:57:46.000000000 +0100
@@ -1,9 +1,15 @@
import re
import inspect
import os
+import sys
import six
+if sys.version_info >= (3, 3):
+ from importlib.machinery import SourceFileLoader
+else:
+ import imp
+
IDENTIFIER = re.compile(r'[a-z_](\w)*$', re.IGNORECASE)
@@ -152,8 +158,24 @@
if not os.path.isfile(abspath):
raise RuntimeError('`%s` is not a file.' % abspath)
+ # First, make sure the code will actually compile (and has no SyntaxErrors)
with open(abspath, 'rb') as f:
- exec(compile(f.read(), abspath, 'exec'), globals(), conf_dict)
+ compiled = compile(f.read(), abspath, 'exec')
+
+ # Next, attempt to actually import the file as a module.
+ # This provides more verbose import-related error reporting than exec()
+ absname, _ = os.path.splitext(abspath)
+ basepath, module_name = absname.rsplit(os.sep, 1)
+ if sys.version_info >= (3, 3):
+ SourceFileLoader(module_name, abspath).load_module(module_name)
+ else:
+ imp.load_module(
+ module_name,
+ *imp.find_module(module_name, [basepath])
+ )
+
+ # If we were able to import as a module, actually exec the compiled code
+ exec(compiled, globals(), conf_dict)
conf_dict['__file__'] = abspath
return conf_from_dict(conf_dict)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/core.py new/pecan-0.8.3/pecan/core.py
--- old/pecan-0.7.0/pecan/core.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/core.py 2015-01-12 23:57:46.000000000 +0100
@@ -11,15 +11,20 @@
import types
import six
+if six.PY3:
+ from .compat import is_bound_method as ismethod
+else:
+ from inspect import ismethod
from webob import (Request as WebObRequest, Response as WebObResponse, exc,
acceptparse)
+from webob.multidict import NestedMultiDict
from .compat import urlparse, unquote_plus, izip
from .secure import handle_security
from .templating import RendererFactory
from .routing import lookup_controller, NonCanonicalPath
-from .util import _cfg, encode_if_needed
+from .util import _cfg, encode_if_needed, getargspec
from .middleware.recursive import ForwardRequestException
@@ -43,7 +48,13 @@
class Request(WebObRequest):
- pass
+
+ def __getattribute__(self, name):
+ try:
+ return WebObRequest.__getattribute__(self, name)
+ except UnicodeDecodeError as e:
+ logger.exception(e)
+ abort(400)
class Response(WebObResponse):
@@ -254,7 +265,8 @@
module = __import__(name, fromlist=fromlist)
kallable = getattr(module, parts[-1])
msg = "%s does not represent a callable class or function."
- assert hasattr(kallable, '__call__'), msg % item
+ if not six.callable(kallable):
+ raise TypeError(msg % item)
return kallable()
raise ImportError('No item named %s' % item)
@@ -338,7 +350,7 @@
return unquote_plus(x) if isinstance(x, six.string_types) \
else x
- remainder = [_decode(x) for x in remainder]
+ remainder = [_decode(x) for x in remainder if x]
if im_self is not None:
args.append(im_self)
@@ -384,18 +396,19 @@
return args, varargs, kwargs
def render(self, template, namespace):
- renderer = self.renderers.get(
- self.default_renderer,
- self.template_path
- )
if template == 'json':
renderer = self.renderers.get('json', self.template_path)
- if ':' in template:
+ elif ':' in template:
+ renderer_name, template = template.split(':', 1)
renderer = self.renderers.get(
- template.split(':')[0],
+ renderer_name,
+ self.template_path
+ )
+ else:
+ renderer = self.renderers.get(
+ self.default_renderer,
self.template_path
)
- template = template.split(':')[1]
return renderer.render(template, namespace)
def find_controller(self, state):
@@ -498,14 +511,22 @@
# fetch any parameters
if req.method == 'GET':
- params = dict(req.GET)
+ params = req.GET
+ elif req.content_type in ('application/json',
+ 'application/javascript'):
+ try:
+ if not isinstance(req.json, dict):
+ raise TypeError('%s is not a dict' % req.json)
+ params = NestedMultiDict(req.GET, req.json)
+ except (TypeError, ValueError):
+ params = req.params
else:
- params = dict(req.params)
+ params = req.params
# fetch the arguments for the controller
args, varargs, kwargs = self.get_args(
state,
- params,
+ params.mixed(),
remainder,
cfg['argspec'],
im_self
@@ -527,6 +548,15 @@
resp = state.response
pecan_state = req.pecan
+ # If a keyword is supplied via HTTP GET or POST arguments, but the
+ # function signature does not allow it, just drop it (rather than
+ # generating a TypeError).
+ argspec = getargspec(controller)
+ keys = kwargs.keys()
+ for key in keys:
+ if key not in argspec.args and not argspec.keywords:
+ kwargs.pop(key)
+
# get the result from the controller
result = controller(*args, **kwargs)
@@ -594,9 +624,15 @@
else:
text = None
if state.response.charset:
- # `response.text` cannot be accessed without a charset
- # (because we don't know which encoding to use)
- text = state.response.text
+ # `response.text` cannot be accessed without a valid
+ # charset (because we don't know which encoding to use)
+ try:
+ text = state.response.text
+ except UnicodeDecodeError:
+ # If a valid charset is not specified, don't bother
+ # trying to guess it (because there's obviously
+ # content, so we know this shouldn't be a 204)
+ pass
if not any((state.response.body, text)):
state.response.status = 204
@@ -684,15 +720,23 @@
# When comparing the argspec of the method to GET/POST params,
# ignore the implicit (req, resp) at the beginning of the function
# signature
- signature_error = TypeError(
- 'When `use_context_locals` is `False`, pecan passes an explicit '
- 'reference to the request and response as the first two arguments '
- 'to the controller.\nChange the `%s.%s.%s` signature to accept '
- 'exactly 2 initial arguments (req, resp)' % (
+ if hasattr(state.controller, '__self__'):
+ _repr = '.'.join((
state.controller.__self__.__class__.__module__,
state.controller.__self__.__class__.__name__,
state.controller.__name__
- )
+ ))
+ else:
+ _repr = '.'.join((
+ state.controller.__module__,
+ state.controller.__name__
+ ))
+
+ signature_error = TypeError(
+ 'When `use_context_locals` is `False`, pecan passes an explicit '
+ 'reference to the request and response as the first two arguments '
+ 'to the controller.\nChange the `%s` signature to accept exactly '
+ '2 initial arguments (req, resp)' % _repr
)
try:
positional = argspec.args[:]
@@ -705,7 +749,13 @@
args, varargs, kwargs = super(ExplicitPecan, self).get_args(
state, all_params, remainder, argspec, im_self
)
- args = [state.request, state.response] + args
+
+ if ismethod(state.controller):
+ args = [state.request, state.response] + args
+ else:
+ # generic controllers have an explicit self *first*
+ # (because they're decorated functions, not instance methods)
+ args[1:1] = [state.request, state.response]
return args, varargs, kwargs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/decorators.py new/pecan-0.8.3/pecan/decorators.py
--- old/pecan-0.7.0/pecan/decorators.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/decorators.py 2015-01-12 23:57:45.000000000 +0100
@@ -1,8 +1,8 @@
-from inspect import getargspec, getmembers, isclass, ismethod, isfunction
+from inspect import getmembers, isclass, ismethod, isfunction
import six
-from .util import _cfg
+from .util import _cfg, getargspec
__all__ = [
'expose', 'transactional', 'accept_noncanonical', 'after_commit',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/hooks.py new/pecan-0.8.3/pecan/hooks.py
--- old/pecan-0.7.0/pecan/hooks.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/hooks.py 2015-01-12 23:57:45.000000000 +0100
@@ -2,6 +2,7 @@
import sys
from inspect import getmembers
+import six
from webob.exc import HTTPFound
from .util import iscontroller, _cfg
@@ -12,8 +13,20 @@
]
-def walk_controller(root_class, controller, hooks):
- if not isinstance(controller, (int, dict)):
+def walk_controller(root_class, controller, hooks, seen=None):
+ seen = seen or set()
+ if type(controller) not in vars(six.moves.builtins).values():
+ # Avoid recursion loops
+ try:
+ if controller in seen:
+ return
+ seen.add(controller)
+ except TypeError:
+ # If we discover an unhashable item (like a list), it's not
+ # something that we want to traverse because it's not the sort of
+ # thing we would add a hook to
+ return
+
for hook in getattr(controller, '__hooks__', []):
# Append hooks from controller class definition
hooks.add(hook)
@@ -38,7 +51,7 @@
value.im_class.mro()[1:]))
):
continue
- walk_controller(root_class, value, hooks)
+ walk_controller(root_class, value, hooks, seen)
class HookControllerMeta(type):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/middleware/debug.py new/pecan-0.8.3/pecan/middleware/debug.py
--- old/pecan-0.7.0/pecan/middleware/debug.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/middleware/debug.py 2015-01-12 23:57:45.000000000 +0100
@@ -269,9 +269,11 @@
self.debugger = debugger
def __call__(self, environ, start_response):
- assert not environ['wsgi.multiprocess'], (
- "The DebugMiddleware middleware is not usable in a "
- "multi-process environment")
+ if environ['wsgi.multiprocess']:
+ raise RuntimeError(
+ "The DebugMiddleware middleware is not usable in a "
+ "multi-process environment"
+ )
if environ.get('paste.testing'):
return self.app(environ, start_response)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/middleware/static.py new/pecan-0.8.3/pecan/middleware/static.py
--- old/pecan-0.7.0/pecan/middleware/static.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/middleware/static.py 2015-01-12 23:57:45.000000000 +0100
@@ -115,7 +115,6 @@
def __init__(self, app, directory, fallback_mimetype='text/plain'):
self.app = app
- self.directory = directory
self.loader = self.get_directory_loader(directory)
self.fallback_mimetype = fallback_mimetype
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/rest.py new/pecan-0.8.3/pecan/rest.py
--- old/pecan-0.7.0/pecan/rest.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/rest.py 2015-01-12 23:57:45.000000000 +0100
@@ -1,4 +1,4 @@
-from inspect import getargspec, ismethod
+from inspect import ismethod
import warnings
from webob import exc
@@ -7,7 +7,7 @@
from .core import abort
from .decorators import expose
from .routing import lookup_controller, handle_lookup_traversal
-from .util import iscontroller
+from .util import iscontroller, getargspec
class RestController(object):
@@ -54,7 +54,10 @@
request.pecan.get('routing_args', [])
)
if len(remainder) < fixed_args:
- abort(400)
+ # For controllers that are missing intermediate IDs
+ # (e.g., /authors/books vs /authors/1/books), return a 404 for an
+ # invalid path.
+ abort(404)
@expose()
def _route(self, args, request=None):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/routing.py new/pecan-0.8.3/pecan/routing.py
--- old/pecan-0.7.0/pecan/routing.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/routing.py 2015-01-12 23:57:45.000000000 +0100
@@ -1,10 +1,9 @@
import warnings
-from inspect import getargspec
from webob import exc
from .secure import handle_security, cross_boundary
-from .util import iscontroller
+from .util import iscontroller, getargspec, _cfg
__all__ = ['lookup_controller', 'find_object']
@@ -149,6 +148,17 @@
if not remainder:
raise PecanNotFound
+
+ prev_remainder = remainder
prev_obj = obj
remainder = rest
obj = getattr(obj, next_obj, None)
+
+ # Last-ditch effort: if there's not a matching subcontroller, no
+ # `_default`, no `_lookup`, and no `_route`, look to see if there's
+ # an `index` that has a generic method defined for the current request
+ # method.
+ if not obj and not notfound_handlers and hasattr(prev_obj, 'index'):
+ if request.method in _cfg(prev_obj.index).get('generic_handlers',
+ {}):
+ return prev_obj.index, prev_remainder
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/tests/middleware/test_debug.py new/pecan-0.8.3/pecan/tests/middleware/test_debug.py
--- old/pecan-0.7.0/pecan/tests/middleware/test_debug.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/tests/middleware/test_debug.py 2015-01-12 23:57:45.000000000 +0100
@@ -58,7 +58,7 @@
app = TestApp(MultiProcessApp(DebugMiddleware(conditional_error_app)))
self.assertRaises(
- AssertionError,
+ RuntimeError,
app.get,
'/'
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/tests/test_base.py new/pecan-0.8.3/pecan/tests/test_base.py
--- old/pecan-0.7.0/pecan/tests/test_base.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/tests/test_base.py 2015-01-12 23:57:46.000000000 +0100
@@ -12,6 +12,7 @@
from webtest import TestApp
import six
from six import b as b_
+from six import u as u_
from six.moves import cStringIO as StringIO
from pecan import (
@@ -68,6 +69,10 @@
def explicit_json_body(self):
response.json_body = {'foo': 'bar'}
+ @expose()
+ def non_unicode(self):
+ return chr(0xc0)
+
return TestApp(Pecan(RootController()))
def test_empty_index(self):
@@ -77,6 +82,10 @@
self.assertEqual(r.headers['Content-Length'], '0')
self.assertEqual(len(r.body), 0)
+ def test_index_with_non_unicode(self):
+ r = self.app_.get('/non_unicode/')
+ self.assertEqual(r.status_int, 200)
+
def test_explicit_body(self):
r = self.app_.get('/explicit_body/')
self.assertEqual(r.status_int, 200)
@@ -137,6 +146,23 @@
assert len(r.body) == 0
+class TestInvalidURLEncoding(PecanTestCase):
+
+ @property
+ def app_(self):
+ class RootController(object):
+
+ @expose()
+ def _route(self, args, request):
+ assert request.path
+
+ return TestApp(Pecan(RootController()))
+
+ def test_rest_with_non_utf_8_body(self):
+ r = self.app_.get('/%aa/', expect_errors=True)
+ assert r.status_int == 400
+
+
class TestIndexRouting(PecanTestCase):
@property
@@ -432,6 +458,16 @@
assert r.status_int == 200
assert r.body == b_('index: 4')
+ def test_explicit_json_kwargs(self):
+ r = self.app_.post_json('/', {'id': '4'})
+ assert r.status_int == 200
+ assert r.body == b_('index: 4')
+
+ def test_path_with_explicit_json_kwargs(self):
+ r = self.app_.post_json('/4', {'id': 'four'})
+ assert r.status_int == 200
+ assert r.body == b_('index: 4')
+
def test_multiple_kwargs(self):
r = self.app_.get('/?id=5&dummy=dummy')
assert r.status_int == 200
@@ -442,6 +478,11 @@
assert r.status_int == 200
assert r.body == b_('index: 6')
+ def test_json_kwargs_from_root(self):
+ r = self.app_.post_json('/', {'id': '6', 'dummy': 'dummy'})
+ assert r.status_int == 200
+ assert r.body == b_('index: 6')
+
# multiple args
def test_multiple_positional_arguments(self):
@@ -469,6 +510,11 @@
assert r.status_int == 200
assert r.body == b_('multiple: five, six')
+ def test_positional_args_with_json_kwargs(self):
+ r = self.app_.post_json('/multiple', {'one': 'five', 'two': 'six'})
+ assert r.status_int == 200
+ assert r.body == b_('multiple: five, six')
+
def test_positional_args_with_url_encoded_dictionary_kwargs(self):
r = self.app_.post('/multiple', {'one': 'Five%20', 'two': 'Six%20%21'})
assert r.status_int == 200
@@ -519,6 +565,11 @@
assert r.status_int == 200
assert r.body == b_('optional: 4')
+ def test_optional_arg_with_json_kwargs(self):
+ r = self.app_.post_json('/optional', {'id': '4'})
+ assert r.status_int == 200
+ assert r.body == b_('optional: 4')
+
def test_optional_arg_with_url_encoded_kwargs(self):
r = self.app_.post('/optional', {'id': 'Some%20Number'})
assert r.status_int == 200
@@ -529,6 +580,11 @@
assert r.status_int == 200
assert r.body == b_('optional: 5')
+ def test_multiple_positional_arguments_with_json_kwargs(self):
+ r = self.app_.post_json('/optional/5', {'id': 'five'})
+ assert r.status_int == 200
+ assert r.body == b_('optional: 5')
+
def test_multiple_positional_url_encoded_arguments_with_kwargs(self):
r = self.app_.post('/optional/Some%20Number', {'id': 'five'})
assert r.status_int == 200
@@ -549,6 +605,11 @@
assert r.status_int == 200
assert r.body == b_('optional: 7')
+ def test_optional_arg_with_multiple_json_kwargs(self):
+ r = self.app_.post_json('/optional', {'id': '7', 'dummy': 'dummy'})
+ assert r.status_int == 200
+ assert r.body == b_('optional: 7')
+
def test_optional_arg_with_multiple_url_encoded_dictionary_kwargs(self):
r = self.app_.post('/optional', {
'id': 'Some%20Number',
@@ -613,6 +674,11 @@
assert r.status_int == 200
assert r.body == b_('multiple_optional: 1, None, None')
+ def test_multiple_optional_positional_args_with_json_kwargs(self):
+ r = self.app_.post_json('/multiple_optional', {'one': '1'})
+ assert r.status_int == 200
+ assert r.body == b_('multiple_optional: 1, None, None')
+
def test_multiple_optional_positional_args_with_encoded_dict_kwargs(self):
r = self.app_.post('/multiple_optional', {'one': 'One%21'})
assert r.status_int == 200
@@ -623,6 +689,11 @@
assert r.status_int == 200
assert r.body == b_('multiple_optional: 1, None, None')
+ def test_multiple_optional_positional_args_and_json_kwargs(self):
+ r = self.app_.post_json('/multiple_optional/1', {'one': 'one'})
+ assert r.status_int == 200
+ assert r.body == b_('multiple_optional: 1, None, None')
+
def test_multiple_optional_encoded_positional_args_and_dict_kwargs(self):
r = self.app_.post('/multiple_optional/One%21', {'one': 'one'})
assert r.status_int == 200
@@ -648,6 +719,14 @@
assert r.status_int == 200
assert r.body == b_('multiple_optional: 1, 2, 3')
+ def test_multiple_optional_args_with_multiple_json_kwargs(self):
+ r = self.app_.post_json(
+ '/multiple_optional',
+ {'one': '1', 'two': '2', 'three': '3', 'four': '4'}
+ )
+ assert r.status_int == 200
+ assert r.body == b_('multiple_optional: 1, 2, 3')
+
def test_multiple_optional_args_with_multiple_encoded_dict_kwargs(self):
r = self.app_.post(
'/multiple_optional',
@@ -701,6 +780,14 @@
assert r.status_int == 200
assert r.body == b_('variable_args: ')
+ def test_variable_args_with_json_kwargs(self):
+ r = self.app_.post_json(
+ '/variable_args',
+ {'id': '3', 'dummy': 'dummy'}
+ )
+ assert r.status_int == 200
+ assert r.body == b_('variable_args: ')
+
def test_variable_kwargs(self):
r = self.app_.get('/variable_kwargs')
assert r.status_int == 200
@@ -727,6 +814,14 @@
assert r.status_int == 200
assert r.body == b_('variable_kwargs: dummy=dummy, id=3')
+ def test_multiple_variable_kwargs_with_json_kwargs(self):
+ r = self.app_.post_json(
+ '/variable_kwargs',
+ {'id': '3', 'dummy': 'dummy'}
+ )
+ assert r.status_int == 200
+ assert r.body == b_('variable_kwargs: dummy=dummy, id=3')
+
def test_multiple_variable_kwargs_with_encoded_dict_kwargs(self):
r = self.app_.post(
'/variable_kwargs',
@@ -771,6 +866,14 @@
assert r.status_int == 200
assert r.body == b_('variable_all: 6, day=12, month=1')
+ def test_variable_post_with_json_kwargs(self):
+ r = self.app_.post_json(
+ '/variable_all/6',
+ {'month': '1', 'day': '12'}
+ )
+ assert r.status_int == 200
+ assert r.body == b_('variable_all: 6, day=12, month=1')
+
def test_variable_post_mixed(self):
r = self.app_.post(
'/variable_all/7',
@@ -779,6 +882,41 @@
assert r.status_int == 200
assert r.body == b_('variable_all: 7, day=12, id=seven, month=1')
+ def test_variable_post_mixed_with_json(self):
+ r = self.app_.post_json(
+ '/variable_all/7',
+ {'id': 'seven', 'month': '1', 'day': '12'}
+ )
+ assert r.status_int == 200
+ assert r.body == b_('variable_all: 7, day=12, id=seven, month=1')
+
+ def test_duplicate_query_parameters_GET(self):
+ r = self.app_.get('/variable_kwargs?list=1&list=2')
+ l = [u_('1'), u_('2')]
+ assert r.status_int == 200
+ assert r.body == b_('variable_kwargs: list=%s' % l)
+
+ def test_duplicate_query_parameters_POST(self):
+ r = self.app_.post('/variable_kwargs',
+ {'list': ['1', '2']})
+ l = [u_('1'), u_('2')]
+ assert r.status_int == 200
+ assert r.body == b_('variable_kwargs: list=%s' % l)
+
+ def test_duplicate_query_parameters_POST_mixed(self):
+ r = self.app_.post('/variable_kwargs?list=1&list=2',
+ {'list': ['3', '4']})
+ l = [u_('1'), u_('2'), u_('3'), u_('4')]
+ assert r.status_int == 200
+ assert r.body == b_('variable_kwargs: list=%s' % l)
+
+ def test_duplicate_query_parameters_POST_mixed_json(self):
+ r = self.app_.post('/variable_kwargs?list=1&list=2',
+ {'list': 3})
+ l = [u_('1'), u_('2'), u_('3')]
+ assert r.status_int == 200
+ assert r.body == b_('variable_kwargs: list=%s' % l)
+
def test_no_remainder(self):
try:
r = self.app_.get('/eater')
@@ -835,11 +973,29 @@
assert r.status_int == 200
assert r.body == b_('eater: 9, None, day=12, month=1')
+ def test_post_empty_remainder_with_json_kwargs(self):
+ r = self.app_.post_json('/eater/9/', {'month': '1', 'day': '12'})
+ assert r.status_int == 200
+ assert r.body == b_('eater: 9, None, day=12, month=1')
+
+ def test_post_remainder_with_json_kwargs(self):
+ r = self.app_.post_json('/eater/9', {'month': '1', 'day': '12'})
+ assert r.status_int == 200
+ assert r.body == b_('eater: 9, None, day=12, month=1')
+
def test_post_many_remainders_with_many_kwargs(self):
r = self.app_.post(
'/eater/10',
{'id': 'ten', 'month': '1', 'day': '12', 'dummy': 'dummy'}
)
+ assert r.status_int == 200
+ assert r.body == b_('eater: 10, dummy, day=12, month=1')
+
+ def test_post_many_remainders_with_many_json_kwargs(self):
+ r = self.app_.post_json(
+ '/eater/10',
+ {'id': 'ten', 'month': '1', 'day': '12', 'dummy': 'dummy'}
+ )
assert r.status_int == 200
assert r.body == b_('eater: 10, dummy, day=12, month=1')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/tests/test_conf.py new/pecan-0.8.3/pecan/tests/test_conf.py
--- old/pecan-0.7.0/pecan/tests/test_conf.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/tests/test_conf.py 2015-01-12 23:57:45.000000000 +0100
@@ -144,6 +144,22 @@
f.name
)
+ def test_config_with_non_package_relative_import(self):
+ from pecan import configuration
+ with tempfile.NamedTemporaryFile('wb', suffix='.py') as f:
+ f.write(b_('\n'.join(['from . import variables'])))
+ f.flush()
+ configuration.Config({})
+
+ try:
+ configuration.conf_from_file(f.name)
+ except (ValueError, SystemError) as e:
+ assert 'relative import' in str(e)
+ else:
+ raise AssertionError(
+ "A relative import-related error should have been raised"
+ )
+
def test_config_with_bad_import(self):
from pecan import configuration
path = ('bad', 'importerror.py')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/tests/test_generic.py new/pecan-0.8.3/pecan/tests/test_generic.py
--- old/pecan-0.7.0/pecan/tests/test_generic.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/tests/test_generic.py 2015-01-12 23:57:45.000000000 +0100
@@ -60,3 +60,29 @@
r = app.delete('/', expect_errors=True)
assert r.status_int == 405
assert r.headers['Allow'] == 'GET, PATCH, POST'
+
+ def test_nested_generic(self):
+
+ class SubSubController(object):
+ @expose(generic=True)
+ def index(self):
+ return 'GET'
+
+ @index.when(method='DELETE', template='json')
+ def do_delete(self, name, *args):
+ return dict(result=name, args=', '.join(args))
+
+ class SubController(object):
+ sub = SubSubController()
+
+ class RootController(object):
+ sub = SubController()
+
+ app = TestApp(Pecan(RootController()))
+ r = app.get('/sub/sub/')
+ assert r.status_int == 200
+ assert r.body == b_('GET')
+
+ r = app.delete('/sub/sub/joe/is/cool')
+ assert r.status_int == 200
+ assert r.body == b_(dumps(dict(result='joe', args='is, cool')))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/tests/test_hooks.py new/pecan-0.8.3/pecan/tests/test_hooks.py
--- old/pecan-0.7.0/pecan/tests/test_hooks.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/tests/test_hooks.py 2015-01-12 23:57:45.000000000 +0100
@@ -1681,6 +1681,19 @@
def get_all(self):
return 'Hello, World!'
+ @staticmethod
+ def static(cls):
+ return 'static'
+
+ @property
+ def foo(self):
+ return 'bar'
+
+ def testing123(self):
+ return 'bar'
+
+ unhashable = [1, 'two', 3]
+
app = TestApp(
make_app(
RootController()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/tests/test_no_thread_locals.py new/pecan-0.8.3/pecan/tests/test_no_thread_locals.py
--- old/pecan-0.7.0/pecan/tests/test_no_thread_locals.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/tests/test_no_thread_locals.py 2015-01-12 23:57:45.000000000 +0100
@@ -1,4 +1,5 @@
-from json import dumps
+import time
+from json import dumps, loads
import warnings
from webtest import TestApp
@@ -7,7 +8,7 @@
import webob
import mock
-from pecan import Pecan, expose, abort
+from pecan import Pecan, expose, abort, Request, Response
from pecan.rest import RestController
from pecan.hooks import PecanHook, HookController
from pecan.tests import PecanTestCase
@@ -24,6 +25,21 @@
assert isinstance(resp, webob.Response)
return 'Hello, World!'
+ @expose()
+ def warning(self):
+ return ("This should be unroutable because (req, resp) are not"
+ " arguments. It should raise a TypeError.")
+
+ @expose(generic=True)
+ def generic(self):
+ return ("This should be unroutable because (req, resp) are not"
+ " arguments. It should raise a TypeError.")
+
+ @generic.when(method='PUT')
+ def generic_put(self, _id):
+ return ("This should be unroutable because (req, resp) are not"
+ " arguments. It should raise a TypeError.")
+
return RootController
def test_locals_are_not_used(self):
@@ -36,6 +52,36 @@
self.assertRaises(AssertionError, Pecan, self.root)
+ def test_threadlocal_argument_warning(self):
+ with mock.patch('threading.local', side_effect=AssertionError()):
+
+ app = TestApp(Pecan(self.root(), use_context_locals=False))
+ self.assertRaises(
+ TypeError,
+ app.get,
+ '/warning/'
+ )
+
+ def test_threadlocal_argument_warning_on_generic(self):
+ with mock.patch('threading.local', side_effect=AssertionError()):
+
+ app = TestApp(Pecan(self.root(), use_context_locals=False))
+ self.assertRaises(
+ TypeError,
+ app.get,
+ '/generic/'
+ )
+
+ def test_threadlocal_argument_warning_on_generic_delegate(self):
+ with mock.patch('threading.local', side_effect=AssertionError()):
+
+ app = TestApp(Pecan(self.root(), use_context_locals=False))
+ self.assertRaises(
+ TypeError,
+ app.put,
+ '/generic/'
+ )
+
class TestIndexRouting(PecanTestCase):
@@ -1310,3 +1356,85 @@
assert run_hook[3] == 'inside_sub'
assert run_hook[4] == 'after1'
assert run_hook[5] == 'after2'
+
+
+class TestGeneric(PecanTestCase):
+
+ @property
+ def root(self):
+ class RootController(object):
+
+ def __init__(self, unique):
+ self.unique = unique
+
+ @expose(generic=True, template='json')
+ def index(self, req, resp):
+ assert self.__class__.__name__ == 'RootController'
+ assert isinstance(req, Request)
+ assert isinstance(resp, Response)
+ assert self.unique == req.headers.get('X-Unique')
+ return {'hello': 'world'}
+
+ @index.when(method='POST', template='json')
+ def index_post(self, req, resp):
+ assert self.__class__.__name__ == 'RootController'
+ assert isinstance(req, Request)
+ assert isinstance(resp, Response)
+ assert self.unique == req.headers.get('X-Unique')
+ return req.json
+
+ @expose(template='json')
+ def echo(self, req, resp):
+ assert self.__class__.__name__ == 'RootController'
+ assert isinstance(req, Request)
+ assert isinstance(resp, Response)
+ assert self.unique == req.headers.get('X-Unique')
+ return req.json
+
+ @expose(template='json')
+ def extra(self, req, resp, first, second):
+ assert self.__class__.__name__ == 'RootController'
+ assert isinstance(req, Request)
+ assert isinstance(resp, Response)
+ assert self.unique == req.headers.get('X-Unique')
+ return {'first': first, 'second': second}
+
+ return RootController
+
+ def test_generics_with_im_self_default(self):
+ uniq = str(time.time())
+ with mock.patch('threading.local', side_effect=AssertionError()):
+ app = TestApp(Pecan(self.root(uniq), use_context_locals=False))
+ r = app.get('/', headers={'X-Unique': uniq})
+ assert r.status_int == 200
+ json_resp = loads(r.body.decode())
+ assert json_resp['hello'] == 'world'
+
+ def test_generics_with_im_self_with_method(self):
+ uniq = str(time.time())
+ with mock.patch('threading.local', side_effect=AssertionError()):
+ app = TestApp(Pecan(self.root(uniq), use_context_locals=False))
+ r = app.post_json('/', {'foo': 'bar'}, headers={'X-Unique': uniq})
+ assert r.status_int == 200
+ json_resp = loads(r.body.decode())
+ assert json_resp['foo'] == 'bar'
+
+ def test_generics_with_im_self_with_path(self):
+ uniq = str(time.time())
+ with mock.patch('threading.local', side_effect=AssertionError()):
+ app = TestApp(Pecan(self.root(uniq), use_context_locals=False))
+ r = app.post_json('/echo/', {'foo': 'bar'},
+ headers={'X-Unique': uniq})
+ assert r.status_int == 200
+ json_resp = loads(r.body.decode())
+ assert json_resp['foo'] == 'bar'
+
+ def test_generics_with_im_self_with_extra_args(self):
+ uniq = str(time.time())
+ with mock.patch('threading.local', side_effect=AssertionError()):
+ app = TestApp(Pecan(self.root(uniq), use_context_locals=False))
+ r = app.get('/extra/123/456', headers={'X-Unique': uniq})
+ assert r.status_int == 200
+ json_resp = loads(r.body.decode())
+ assert json_resp['first'] == '123'
+ assert json_resp['second'] == '456'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/tests/test_rest.py new/pecan-0.8.3/pecan/tests/test_rest.py
--- old/pecan-0.7.0/pecan/tests/test_rest.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/tests/test_rest.py 2015-01-12 23:57:46.000000000 +0100
@@ -1,11 +1,12 @@
-from webtest import TestApp
+import struct
import warnings
try:
from simplejson import dumps, loads
except:
from json import dumps, loads # noqa
-from six import b as b_
+from six import b as b_, PY3
+from webtest import TestApp
from pecan import abort, expose, make_app, response, redirect
from pecan.rest import RestController
@@ -727,11 +728,11 @@
assert r.status_int == 200
assert r.body == b_('4')
- r = app.get('/foos/bars/', status=400)
- assert r.status_int == 400
+ r = app.get('/foos/bars/', status=404)
+ assert r.status_int == 404
- r = app.get('/foos/bars/1', status=400)
- assert r.status_int == 400
+ r = app.get('/foos/bars/1', status=404)
+ assert r.status_int == 404
def test_nested_get_all_with_lookup(self):
@@ -783,10 +784,9 @@
assert r.status_int == 200
assert r.body == b_('4')
- r = app.get('/foos/bars/', status=400)
- assert r.status_int == 400
-
- r = app.get('/foos/bars/', status=400)
+ r = app.get('/foos/bars/')
+ assert r.status_int == 302
+ assert r.headers['Location'].endswith('/lookup-hit/')
r = app.get('/foos/bars/1')
assert r.status_int == 302
@@ -893,7 +893,7 @@
self.assertEqual(r.body, b_(dumps(dict(items=BarsController.data[1]))))
r = app.get('/foos/bars', expect_errors=True)
- self.assertEqual(r.status_int, 400)
+ self.assertEqual(r.status_int, 404)
def test_custom_with_trailing_slash(self):
@@ -1360,6 +1360,27 @@
assert r.status_int == 200
assert r.body == b_("DEFAULT missing")
+ def test_rest_with_non_utf_8_body(self):
+ if PY3:
+ # webob+PY3 doesn't suffer from this bug; the POST parsing in PY3
+ # seems to more gracefully detect the bytestring
+ return
+
+ class FooController(RestController):
+
+ @expose()
+ def post(self):
+ return "POST"
+
+ class RootController(RestController):
+ foo = FooController()
+
+ app = TestApp(make_app(RootController()))
+
+ data = struct.pack('255h', *range(0, 255))
+ r = app.post('/foo/', data, expect_errors=True)
+ assert r.status_int == 400
+
def test_dynamic_rest_lookup(self):
class BarController(RestController):
@expose()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/tests/test_util.py new/pecan-0.8.3/pecan/tests/test_util.py
--- old/pecan-0.7.0/pecan/tests/test_util.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pecan-0.8.3/pecan/tests/test_util.py 2015-01-12 23:57:45.000000000 +0100
@@ -0,0 +1,95 @@
+import functools
+import inspect
+import unittest
+
+from pecan import expose
+from pecan import util
+
+
+class TestArgSpec(unittest.TestCase):
+
+ @property
+ def controller(self):
+
+ class RootController(object):
+
+ @expose()
+ def index(self, a, b, c=1, *args, **kwargs):
+ return 'Hello, World!'
+
+ @staticmethod
+ @expose()
+ def static_index(a, b, c=1, *args, **kwargs):
+ return 'Hello, World!'
+
+ return RootController()
+
+ def test_no_decorator(self):
+ expected = inspect.getargspec(self.controller.index.__func__)
+ actual = util.getargspec(self.controller.index.__func__)
+ assert expected == actual
+
+ expected = inspect.getargspec(self.controller.static_index)
+ actual = util.getargspec(self.controller.static_index)
+ assert expected == actual
+
+ def test_simple_decorator(self):
+ def dec(f):
+ return f
+
+ expected = inspect.getargspec(self.controller.index.__func__)
+ actual = util.getargspec(dec(self.controller.index.__func__))
+ assert expected == actual
+
+ expected = inspect.getargspec(self.controller.static_index)
+ actual = util.getargspec(dec(self.controller.static_index))
+ assert expected == actual
+
+ def test_simple_wrapper(self):
+ def dec(f):
+ @functools.wraps(f)
+ def wrapped(*a, **kw):
+ return f(*a, **kw)
+ return wrapped
+
+ expected = inspect.getargspec(self.controller.index.__func__)
+ actual = util.getargspec(dec(self.controller.index.__func__))
+ assert expected == actual
+
+ expected = inspect.getargspec(self.controller.static_index)
+ actual = util.getargspec(dec(self.controller.static_index))
+ assert expected == actual
+
+ def test_multiple_decorators(self):
+ def dec(f):
+ @functools.wraps(f)
+ def wrapped(*a, **kw):
+ return f(*a, **kw)
+ return wrapped
+
+ expected = inspect.getargspec(self.controller.index.__func__)
+ actual = util.getargspec(dec(dec(dec(self.controller.index.__func__))))
+ assert expected == actual
+
+ expected = inspect.getargspec(self.controller.static_index)
+ actual = util.getargspec(dec(dec(dec(
+ self.controller.static_index))))
+ assert expected == actual
+
+ def test_decorator_with_args(self):
+ def dec(flag):
+ def inner(f):
+ @functools.wraps(f)
+ def wrapped(*a, **kw):
+ return f(*a, **kw)
+ return wrapped
+ return inner
+
+ expected = inspect.getargspec(self.controller.index.__func__)
+ actual = util.getargspec(dec(True)(self.controller.index.__func__))
+ assert expected == actual
+
+ expected = inspect.getargspec(self.controller.static_index)
+ actual = util.getargspec(dec(True)(
+ self.controller.static_index))
+ assert expected == actual
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan/util.py new/pecan-0.8.3/pecan/util.py
--- old/pecan-0.7.0/pecan/util.py 2014-08-29 14:51:05.000000000 +0200
+++ new/pecan-0.8.3/pecan/util.py 2015-01-12 23:57:45.000000000 +0100
@@ -1,10 +1,44 @@
+import inspect
import sys
+import six
+
def iscontroller(obj):
return getattr(obj, 'exposed', False)
+def getargspec(method):
+ """
+ Drill through layers of decorators attempting to locate the actual argspec
+ for a method.
+ """
+
+ argspec = inspect.getargspec(method)
+ args = argspec[0]
+ if args and args[0] == 'self':
+ return argspec
+ if hasattr(method, '__func__'):
+ method = method.__func__
+
+ func_closure = six.get_function_closure(method)
+
+ # NOTE(sileht): if the closure is None we cannot look deeper,
+ # so return actual argspec, this occurs when the method
+ # is static for example.
+ if func_closure is None:
+ return argspec
+
+ closure = next(
+ (
+ c for c in func_closure if six.callable(c.cell_contents)
+ ),
+ None
+ )
+ method = closure.cell_contents
+ return getargspec(method)
+
+
def _cfg(f):
if not hasattr(f, '_pecan'):
f._pecan = {}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan.egg-info/PKG-INFO new/pecan-0.8.3/pecan.egg-info/PKG-INFO
--- old/pecan-0.7.0/pecan.egg-info/PKG-INFO 2014-08-29 14:51:16.000000000 +0200
+++ new/pecan-0.8.3/pecan.egg-info/PKG-INFO 2015-01-12 23:57:54.000000000 +0100
@@ -1,7 +1,7 @@
Metadata-Version: 1.1
Name: pecan
-Version: 0.7.0
-Summary: A WSGI object-dispatching web framework, designed to be lean and fast, with few dependancies.
+Version: 0.8.3
+Summary: A WSGI object-dispatching web framework, designed to be lean and fast, with few dependencies.
Home-page: http://github.com/stackforge/pecan
Author: Jonathan LaCour
Author-email: info(a)pecanpy.org
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan.egg-info/SOURCES.txt new/pecan-0.8.3/pecan.egg-info/SOURCES.txt
--- old/pecan-0.7.0/pecan.egg-info/SOURCES.txt 2014-08-29 14:51:16.000000000 +0200
+++ new/pecan-0.8.3/pecan.egg-info/SOURCES.txt 2015-01-12 23:57:54.000000000 +0100
@@ -91,6 +91,7 @@
pecan/tests/test_scaffolds.py
pecan/tests/test_secure.py
pecan/tests/test_templating.py
+pecan/tests/test_util.py
pecan/tests/config_fixtures/config.py
pecan/tests/config_fixtures/empty.py
pecan/tests/config_fixtures/foobar.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/pecan.egg-info/requires.txt new/pecan-0.8.3/pecan.egg-info/requires.txt
--- old/pecan-0.7.0/pecan.egg-info/requires.txt 2014-08-29 14:51:16.000000000 +0200
+++ new/pecan-0.8.3/pecan.egg-info/requires.txt 2015-01-12 23:57:54.000000000 +0100
@@ -3,4 +3,4 @@
WebTest>=1.3.1
six
logutils>=0.3
-singledispatch
\ No newline at end of file
+singledispatch
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/setup.cfg new/pecan-0.8.3/setup.cfg
--- old/pecan-0.7.0/setup.cfg 2014-08-29 14:51:16.000000000 +0200
+++ new/pecan-0.8.3/setup.cfg 2015-01-12 23:57:54.000000000 +0100
@@ -9,7 +9,7 @@
norecursedirs = +package+ config_fixtures docs .git *.egg .tox
[egg_info]
-tag_svn_revision = 0
tag_date = 0
+tag_svn_revision = 0
tag_build =
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pecan-0.7.0/setup.py new/pecan-0.8.3/setup.py
--- old/pecan-0.7.0/setup.py 2014-08-29 14:51:06.000000000 +0200
+++ new/pecan-0.8.3/setup.py 2015-01-12 23:57:46.000000000 +0100
@@ -3,7 +3,7 @@
from setuptools import setup, find_packages
-version = '0.7.0'
+version = '0.8.3'
#
# determine requirements
@@ -70,7 +70,7 @@
name='pecan',
version=version,
description="A WSGI object-dispatching web framework, designed to be "
- "lean and fast, with few dependancies.",
+ "lean and fast, with few dependencies.",
long_description=None,
classifiers=[
'Development Status :: 5 - Production/Stable',
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package datovka for openSUSE:Factory checked in at 2015-02-25 02:17:55
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/datovka (Old)
and /work/SRC/openSUSE:Factory/.datovka.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "datovka"
Changes:
--------
--- /work/SRC/openSUSE:Factory/datovka/datovka.changes 2015-02-13 08:35:30.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.datovka.new/datovka.changes 2015-02-25 02:18:24.000000000 +0100
@@ -1,0 +2,10 @@
+Tue Feb 24 12:44:21 UTC 2015 - tchvatal(a)suse.com
+
+- Version bump to 4.1.2:
+ * Various bugfixes
+- Add patch to not ask about new version availabilty:
+ * 0001-no-check-new-versions.patch
+- Refreshed patch:
+ * datovka-fix-pro.patch
+
+-------------------------------------------------------------------
Old:
----
datovka-4.1.0-src.tar.xz
New:
----
0001-no-check-new-versions.patch
datovka-4.1.2-src.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ datovka.spec ++++++
--- /var/tmp/diff_new_pack.hSmPnQ/_old 2015-02-25 02:18:25.000000000 +0100
+++ /var/tmp/diff_new_pack.hSmPnQ/_new 2015-02-25 02:18:25.000000000 +0100
@@ -17,7 +17,7 @@
Name: datovka
-Version: 4.1.0
+Version: 4.1.2
Release: 0
Summary: Library to access Czech eGov system \"Datove schranky\"
License: LGPL-2.0+
@@ -26,6 +26,8 @@
Source0: https://secure.nic.cz/files/datove_schranky/%{version}/%{name}-%{version}-s…
# PATCH-FIX-UPSTREAM: remove some issues with current .pro file
Patch0: datovka-fix-pro.patch
+# PATCH-FIX-SUSE: do not check for newer versions in app (taken from Fedora)
+Patch1: 0001-no-check-new-versions.patch
BuildRequires: libqt5-linguist
BuildRequires: openssl-devel
BuildRequires: pkgconfig(Qt5Core) >= 5.2.0
@@ -50,8 +52,9 @@
%{?lang_package}
%prep
-%setup -q -c %{name}
+%setup -q
%patch0 -p1
+%patch1 -p1
sed -i \
-e 's:lrelease:lrelease-qt5:g' \
%{name}.pro
@@ -66,7 +69,7 @@
# fix desktop file
sed -i \
- -e 's:Office:Office;Network;Email;:g' \
+ -e 's:Office;:Office;Network;Email;:g' \
%{buildroot}%{_datadir}/applications/datovka.desktop
rm -rf %{buildroot}%{_datadir}/datovka/doc
@@ -75,6 +78,7 @@
%doc AUTHORS COPYING
%{_bindir}/datovka
%{_datadir}/applications/datovka.desktop
+%{_datadir}/appdata/datovka.appdata.xml
%dir %{_datadir}/datovka
%dir %{_datadir}/datovka/localisations/
%{_datadir}/datovka/localisations/datovka_cs.qm
++++++ 0001-no-check-new-versions.patch ++++++
Do not check for a new version by default.
diff --git a/src/common.cpp b/src/common.cpp
index cbfabd3..9eb8eaf 100644
--- a/src/common.cpp
+++ b/src/common.cpp
@@ -74,7 +74,7 @@ GlobPreferences::GlobPreferences(void)
store_additional_data_on_disk(true),
certificate_validation_date(DOWNLOAD_DATE),
check_crl(true),
- check_new_versions(true),
+ check_new_versions(false),
send_stats_with_version_checks(false),
download_on_background(false),
timer_value(10),
++++++ datovka-4.1.0-src.tar.xz -> datovka-4.1.2-src.tar.xz ++++++
++++ 110873 lines of diff (skipped)
++++++ datovka-fix-pro.patch ++++++
--- /var/tmp/diff_new_pack.hSmPnQ/_old 2015-02-25 02:18:25.000000000 +0100
+++ /var/tmp/diff_new_pack.hSmPnQ/_new 2015-02-25 02:18:25.000000000 +0100
@@ -1,7 +1,7 @@
-Index: datovka-4.1.0/datovka.pro
+Index: datovka-4.1.2/datovka.pro
===================================================================
---- datovka-4.1.0.orig/datovka.pro
-+++ datovka-4.1.0/datovka.pro
+--- datovka-4.1.2.orig/datovka.pro
++++ datovka-4.1.2/datovka.pro
@@ -49,7 +49,6 @@ isEqual(QT_MAJOR_VERSION, $${REQUIRED_MA
#LIBISDS_PREFIX = "$$HOME/third_party/built"
@@ -10,7 +10,20 @@
VERSION=\\\"$${VERSION}\\\"
unix:!macx {
-@@ -124,8 +123,11 @@ unix:!macx {
+@@ -101,12 +100,6 @@ unix:!macx {
+ localisation.files += locale/datovka_cs.qm \
+ locale/datovka_en.qm
+
+- additional.path = "$${TEXT_FILES_INST_DIR}"
+- additional.files = \
+- AUTHORS \
+- COPYING \
+- README
+-
+ DEFINES += DATADIR=\\\"$$DATADIR\\\" \
+ PKGDATADIR=\\\"$$PKGDATADIR\\\" \
+ LOCALE_INST_DIR="\"\\\"$${LOCALE_INST_DIR}\\\"\"" \
+@@ -129,8 +122,11 @@ unix:!macx {
}
}
@@ -24,7 +37,7 @@
-Wall -Wextra -pedantic
INCLUDEPATH += \
-@@ -188,11 +190,6 @@ macx {
+@@ -196,11 +192,6 @@ macx {
locale/datovka_en.qm
localisation.files += locale/qtbase_cs.qm
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0
Hello community,
here is the log from the commit of package ghc for openSUSE:Factory checked in at 2015-02-25 02:17:46
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc (Old)
and /work/SRC/openSUSE:Factory/.ghc.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc"
Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc/ghc.changes 2015-02-05 11:00:50.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.ghc.new/ghc.changes 2015-02-25 02:18:21.000000000 +0100
@@ -1,0 +2,6 @@
+Mon Feb 23 16:48:10 UTC 2015 - peter.trommler(a)ohm-hochschule.de
+
+- drop ghc-cabal-unversion-docdir.patch
+ * ghc-rpm-macros follows upstream ghc again
+
+-------------------------------------------------------------------
Old:
----
ghc-cabal-unversion-docdir.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc.spec ++++++
--- /var/tmp/diff_new_pack.KTZvYf/_old 2015-02-25 02:18:22.000000000 +0100
+++ /var/tmp/diff_new_pack.KTZvYf/_new 2015-02-25 02:18:22.000000000 +0100
@@ -1,7 +1,7 @@
#
# spec file for package ghc
#
-# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -55,8 +55,6 @@
Source1: ghc-rpmlintrc
# PATCH-FIX-UPSTREAM llvm-powerpc64-datalayout.patch peter.trommler(a)ohm-hochschule.de - Add target datalayout for llvm on powerpc 64.
Patch8: llvm-powerpc64-datalayout.patch
-# PATCH-FIX-OPENSUSE ghc-cabal-unversion-docdir.patch peter.trommler(a)ohm-hochschule.de - Remove versions in library docdirs. Required for compatibility with ghc-rpm-macros 1.0 and up. Can be removed once we move to ghc 7.8.x. Fedora patch 16.
-Patch9: ghc-cabal-unversion-docdir.patch
# PATCH-FIX-UPSTREAM D349.patch peter.trommler(a)ohm-hochschule.de - Fix dynamic linker, see Haskell trac #8935.
Patch12: D349.patch
# PATCH-FIX-UPSTREAM integer-gmp.patch peter.trommler(a)ohm-hochschule.de -- Fix upstream ticket #8156 see https://ghc.haskell.org/trac/ghc/ticket/8156. We need this for SLE 11 where libgmp is too old and so we have to use the bundled libgmp. This patch fixes the build.
@@ -164,7 +162,6 @@
%prep
%setup -q
%patch8 -p1
-%patch9 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe(a)opensuse.org
For additional commands, e-mail: opensuse-commit+help(a)opensuse.org
1
0