Usage of Copr.repos
by Tomas Radej
Hi,
Can some of you guys please tell me what the Copr.repos class member is
used for?
I understand that it contains .repo files, but where will these come
from and where will they go? Are they .repos for pointing to
coprs/chroots created within the copr application, or will they be used
as external repos submitted by users for build time or even something
else?
Does the variable hold URLs or a list of strings or something else? Now
I dont't really know what the variable does and/or if I'm supposed
to touch it when implementing the generation of repo files for
coprs/chroots (TRAC ticket 21 [1]).
Thanks a lot, TR
[1] https://fedorahosted.org/copr/ticket/21
--
Tomas Radej <tradej(a)redhat.com>
10 years, 2 months
copr-be status
by Seth Vidal
Hi folks,
I've gotten the copr backend back up and running in our cloud instance
after the update problems.
It is currently building any unfinished build requests. The builder
instances are slightly bigger than before and they spin up slightly
faster (49s vs 65s) which is lovely.
I still have to move the frontend over to the new cloud instance - but
that's going to be another day at the moment.
-sv
10 years, 3 months
[copr] master: Sort the mock_chroots on copr overview page correctly (7dee8dc)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 7dee8dc63b3785919688a81487e71bf3315ff8d8
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Thu Feb 21 14:04:55 2013 +0100
Sort the mock_chroots on copr overview page correctly
>---------------------------------------------------------------
coprs_frontend/coprs/logic/coprs_logic.py | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/coprs_frontend/coprs/logic/coprs_logic.py b/coprs_frontend/coprs/logic/coprs_logic.py
index 42fa24f..ac0219a 100644
--- a/coprs_frontend/coprs/logic/coprs_logic.py
+++ b/coprs_frontend/coprs/logic/coprs_logic.py
@@ -26,7 +26,10 @@ class CoprsLogic(object):
order_by(models.Build.submitted_on.desc())
if with_mock_chroots:
query = query.outerjoin(*models.Copr.mock_chroots.attr).\
- options(db.contains_eager(*models.Copr.mock_chroots.attr))
+ options(db.contains_eager(*models.Copr.mock_chroots.attr)).\
+ order_by(models.MockChroot.os_release.asc()).\
+ order_by(models.MockChroot.os_version.asc()).\
+ order_by(models.MockChroot.arch.asc())
return query
10 years, 3 months
[copr] master: Allow altering actions by backend (0ef0ef6)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 0ef0ef68b8209101f7511cf4c36eb344e1144695
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Thu Feb 21 10:12:30 2013 +0100
Allow altering actions by backend
>---------------------------------------------------------------
.../coprs/views/backend_ns/backend_general.py | 25 +++++++
coprs_frontend/tests/coprs_test_case.py | 24 +++++++
.../test_views/test_backend_ns/test_general.py | 68 ++++++++++++++++++++
3 files changed, 117 insertions(+), 0 deletions(-)
diff --git a/coprs_frontend/coprs/views/backend_ns/backend_general.py b/coprs_frontend/coprs/views/backend_ns/backend_general.py
index f6ce69a..27baca6 100644
--- a/coprs_frontend/coprs/views/backend_ns/backend_general.py
+++ b/coprs_frontend/coprs/views/backend_ns/backend_general.py
@@ -47,3 +47,28 @@ def waiting_actions():
actions = models.Action.query.filter(models.Action.backend_result==helpers.BackendResultEnum('waiting')).all()
return flask.jsonify({'actions': [action.to_dict(options={'__columns_except__': ['backend_result', 'backend_message']}) for action in actions]})
+
+# TODO: this is very similar to update_builds, we should pull out the common functionality into a single function
+(a)backend_ns.route('/update_actions/', methods=['POST', 'PUT'])
+(a)misc.backend_authenticated
+def update_actions():
+ to_update = {}
+ for action in flask.request.json['actions']:
+ to_update[action['id']] = action
+
+ if not to_update:
+ return json.dumps({'warning': 'No parsed actions'})
+
+ existing = {}
+ for action in models.Action.query.filter(models.Action.id.in_(to_update.keys())).all():
+ existing[action.id] = action
+
+ non_existing_ids = list(set(to_update.keys()) - set(existing.keys()))
+
+ for i, action in existing.items():
+ existing[i].backend_result = to_update[i]['backend_result']
+ existing[i].backend_message = to_update[i]['backend_message']
+
+ db.session.commit()
+
+ return flask.jsonify({'updated_actions_ids': list(existing.keys()), 'non_existing_actions_ids': non_existing_ids})
diff --git a/coprs_frontend/tests/coprs_test_case.py b/coprs_frontend/tests/coprs_test_case.py
index 82e7a38..dcb0cb9 100644
--- a/coprs_frontend/tests/coprs_test_case.py
+++ b/coprs_frontend/tests/coprs_test_case.py
@@ -1,5 +1,6 @@
import base64
import os
+import time
import pytest
@@ -96,3 +97,26 @@ class CoprsTestCase(object):
self.cp3 = models.CoprPermission(copr = self.c3, user = self.u1, copr_builder = helpers.PermissionEnum('request'), copr_admin = helpers.PermissionEnum('approved'))
self.db.session.add_all([self.cp1, self.cp2, self.cp3])
+
+ @pytest.fixture
+ def f_actions(self):
+ self.a1 = models.Action(action_type=helpers.ActionTypeEnum('rename'),
+ object_type='copr',
+ object_id=self.c1.id,
+ old_value='{0}/{1}'.format(self.c1.owner.name, self.c1.name),
+ new_value='{0}/new_name'.format(self.c1.owner.name),
+ created_on=int(time.time()))
+ self.a2 = models.Action(action_type=helpers.ActionTypeEnum('rename'),
+ object_type='copr',
+ object_id=self.c2.id,
+ old_value='{0}/{1}'.format(self.c2.owner.name, self.c2.name),
+ new_value='{0}/new_name2'.format(self.c2.owner.name),
+ created_on=int(time.time()))
+ self.a3 = models.Action(action_type=helpers.ActionTypeEnum('delete'),
+ object_type='copr',
+ object_id=100,
+ old_value='asd/qwe',
+ new_value=None,
+ backend_result=helpers.BackendResultEnum('success'),
+ created_on=int(time.time()))
+ self.db.session.add_all([self.a1, self.a2, self.a3])
diff --git a/coprs_frontend/tests/test_views/test_backend_ns/test_general.py b/coprs_frontend/tests/test_views/test_backend_ns/test_general.py
index d5433d7..5b021d8 100644
--- a/coprs_frontend/tests/test_views/test_backend_ns/test_general.py
+++ b/coprs_frontend/tests/test_views/test_backend_ns/test_general.py
@@ -127,3 +127,71 @@ class TestUpdateBuilds(CoprsTestCase):
assert len(signals_received) == 1
self.db.session.add(self.b2)
assert signals_received[0].id == 2
+
+class TestWaitingActions(CoprsTestCase):
+ def test_no_waiting_builds(self):
+ assert '"actions": []' in self.tc.get('/backend/waiting_actions/').data
+
+ def test_waiting_build_only_lists_not_started_or_ended(self, f_users, f_coprs, f_actions, f_db):
+ r = self.tc.get('/backend/waiting_actions/')
+ assert len(json.loads(r.data)['actions']) == 2
+
+class TestUpdateActions(CoprsTestCase):
+ data1 = """
+{
+ "actions":[
+ {
+ "id": 1,
+ "backend_result": 1,
+ "backend_message": "no problem"
+ }
+ ]
+}"""
+ data2 = """
+{
+ "actions":[
+ {
+ "id": 1,
+ "backend_result": 1,
+ "backend_message": null
+ },
+ {
+ "id": 2,
+ "backend_result": 2,
+ "backend_message": "problem!"
+ },
+ {
+ "id": 100,
+ "backend_result": 123,
+ "backend_message": "wheeeee!"
+ }
+ ]
+}"""
+
+ def test_update_one_action(self, f_users, f_coprs, f_actions, f_db):
+ r = self.tc.post('/backend/update_actions/',
+ content_type='application/json',
+ headers=self.auth_header,
+ data=self.data1)
+ assert json.loads(r.data)["updated_actions_ids"] == [1]
+ assert json.loads(r.data)["non_existing_actions_ids"] == []
+
+ updated = self.models.Action.query.filter(self.models.Action.id==1).first()
+ assert updated.backend_result == 1
+ assert updated.backend_message == "no problem"
+
+ def test_update_more_existent_and_non_existent_builds(self, f_users, f_coprs, f_actions, f_db):
+ r = self.tc.post('/backend/update_actions/',
+ content_type='application/json',
+ headers=self.auth_header,
+ data=self.data2)
+ assert sorted(json.loads(r.data)["updated_actions_ids"]) == [1, 2]
+ assert json.loads(r.data)["non_existing_actions_ids"] == [100]
+
+ updated = self.models.Action.query.filter(self.models.Action.id==1).first()
+ assert updated.backend_result == 1
+ assert updated.backend_message == None
+
+ updated2 = self.models.Action.query.filter(self.models.Action.id==2).first()
+ assert updated2.backend_result == 2
+ assert updated2.backend_message == "problem!"
10 years, 3 months
[copr] master: Create a backend view that will render waiting actions (1084d92)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 1084d9202648d408bbc66bee5e1923ddb692bdb9
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Wed Feb 20 13:58:17 2013 +0100
Create a backend view that will render waiting actions
>---------------------------------------------------------------
.../coprs/views/backend_ns/backend_general.py | 7 +++++++
1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/coprs_frontend/coprs/views/backend_ns/backend_general.py b/coprs_frontend/coprs/views/backend_ns/backend_general.py
index c51fcb6..f6ce69a 100644
--- a/coprs_frontend/coprs/views/backend_ns/backend_general.py
+++ b/coprs_frontend/coprs/views/backend_ns/backend_general.py
@@ -1,6 +1,7 @@
import flask
from coprs import db
+from coprs import helpers
from coprs import models
from coprs.logic import builds_logic
@@ -40,3 +41,9 @@ def update_builds():
db.session.commit()
return flask.jsonify({'updated_builds_ids': list(existing.keys()), 'non_existing_builds_ids': non_existing_ids})
+
+(a)backend_ns.route('/waiting_actions/')
+def waiting_actions():
+ actions = models.Action.query.filter(models.Action.backend_result==helpers.BackendResultEnum('waiting')).all()
+
+ return flask.jsonify({'actions': [action.to_dict(options={'__columns_except__': ['backend_result', 'backend_message']}) for action in actions]})
10 years, 3 months
[copr] master: Use values from enum, not strings (d116daa)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit d116daa86b5d12f56e1235921c59c6825a3d14c0
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Wed Feb 20 13:50:40 2013 +0100
Use values from enum, not strings
>---------------------------------------------------------------
coprs_frontend/coprs/logic/coprs_logic.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/coprs_frontend/coprs/logic/coprs_logic.py b/coprs_frontend/coprs/logic/coprs_logic.py
index 4b4e48c..42fa24f 100644
--- a/coprs_frontend/coprs/logic/coprs_logic.py
+++ b/coprs_frontend/coprs/logic/coprs_logic.py
@@ -98,7 +98,7 @@ class CoprsLogic(object):
# if we fire a models.Copr.query, it will use the modified copr in session
# -> workaround this by just getting the name
old_copr_name = db.session.query(models.Copr.name).filter(models.Copr.id==copr.id).first()[0]
- action = models.Action(action_type='rename',
+ action = models.Action(action_type=helpers.ActionTypeEnum('rename'),
object_type='copr',
object_id=copr.id,
old_value='{0}/{1}'.format(copr.owner.name, old_copr_name),
10 years, 3 months
[copr] master: Introduce Action model for recording special actions (copr renaming/deleting/etc) (bd4a81b)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit bd4a81bad1f13802b85a064a752c17dab4c94746
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Wed Feb 20 13:28:43 2013 +0100
Introduce Action model for recording special actions (copr renaming/deleting/etc)
>---------------------------------------------------------------
.../alembic/versions/544873aa3ba1_add_action.py | 37 +++++++++++++++++++
coprs_frontend/coprs/exceptions.py | 5 +++
coprs_frontend/coprs/forms.py | 2 +-
coprs_frontend/coprs/helpers.py | 8 ++++
coprs_frontend/coprs/logic/coprs_logic.py | 38 ++++++++++++++++----
coprs_frontend/coprs/models.py | 30 +++++++++++++++
.../coprs/views/coprs_ns/coprs_general.py | 14 +++++--
7 files changed, 122 insertions(+), 12 deletions(-)
diff --git a/coprs_frontend/alembic/versions/544873aa3ba1_add_action.py b/coprs_frontend/alembic/versions/544873aa3ba1_add_action.py
new file mode 100644
index 0000000..c3cf2ac
--- /dev/null
+++ b/coprs_frontend/alembic/versions/544873aa3ba1_add_action.py
@@ -0,0 +1,37 @@
+"""empty message
+
+Revision ID: 544873aa3ba1
+Revises: 1ee4b45f5476
+Create Date: 2013-02-20 13:20:34.778470
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '544873aa3ba1'
+down_revision = '1ee4b45f5476'
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade():
+ ### commands auto generated by Alembic - please adjust! ###
+ op.create_table('action',
+ sa.Column('id', sa.Integer(), nullable=False),
+ sa.Column('action_type', sa.Integer(), nullable=False),
+ sa.Column('object_type', sa.String(length=20), nullable=True),
+ sa.Column('object_id', sa.Integer(), nullable=True),
+ sa.Column('old_value', sa.String(length=255), nullable=True),
+ sa.Column('new_value', sa.String(length=255), nullable=True),
+ sa.Column('backend_result', sa.Integer(), nullable=True),
+ sa.Column('backend_message', sa.Text(), nullable=True),
+ sa.Column('created_on', sa.Integer(), nullable=True),
+ sa.PrimaryKeyConstraint('id')
+ )
+ ### end Alembic commands ###
+
+
+def downgrade():
+ ### commands auto generated by Alembic - please adjust! ###
+ op.drop_table('action')
+ ### end Alembic commands ###
diff --git a/coprs_frontend/coprs/exceptions.py b/coprs_frontend/coprs/exceptions.py
index 09888e2..da744b2 100644
--- a/coprs_frontend/coprs/exceptions.py
+++ b/coprs_frontend/coprs/exceptions.py
@@ -12,3 +12,8 @@ class DuplicateException(BaseException):
class InsufficientRightsException(BaseException):
pass
+
+class ActionInProgressException(BaseException):
+ def __init__(self, msg, action):
+ self.msg = msg
+ self.action = action
diff --git a/coprs_frontend/coprs/forms.py b/coprs_frontend/coprs/forms.py
index 6d14b60..5c80c33 100644
--- a/coprs_frontend/coprs/forms.py
+++ b/coprs_frontend/coprs/forms.py
@@ -41,7 +41,7 @@ class CoprUniqueNameValidator(object):
self.message = message
def __call__(self, form, field):
- existing = coprs_logic.CoprsLogic.exists_for_current_user(flask.g.user, field.data).first()
+ existing = coprs_logic.CoprsLogic.exists_for_user(flask.g.user, field.data).first()
if existing and str(existing.id) != form.id.data:
raise wtf.ValidationError(self.message.format(field.data))
diff --git a/coprs_frontend/coprs/helpers.py b/coprs_frontend/coprs/helpers.py
index ac105ec..15e942e 100644
--- a/coprs_frontend/coprs/helpers.py
+++ b/coprs_frontend/coprs/helpers.py
@@ -35,6 +35,14 @@ class PermissionEnum(object):
def choices_list(cls, without = -1):
return [(n, k) for k, n in cls.vals.items() if n != without]
+class ActionTypeEnum(object):
+ __metaclass__ = EnumType
+ vals = {'delete': 0, 'rename': 1}
+
+class BackendResultEnum(object):
+ __metaclass__ = EnumType
+ vals = {'waiting': 0, 'success': 1, 'failure': 2}
+
class Paginator(object):
def __init__(self, query, total_count, page = 1, per_page_override = None, urls_count_override = None):
self.query = query
diff --git a/coprs_frontend/coprs/logic/coprs_logic.py b/coprs_frontend/coprs/logic/coprs_logic.py
index aee017d..4b4e48c 100644
--- a/coprs_frontend/coprs/logic/coprs_logic.py
+++ b/coprs_frontend/coprs/logic/coprs_logic.py
@@ -78,7 +78,7 @@ class CoprsLogic(object):
@classmethod
def new(cls, user, copr, check_for_duplicates = True):
- if check_for_duplicates and cls.exists_for_current_user(user, copr.name).all():
+ if check_for_duplicates and cls.exists_for_user(user, copr.name).all():
raise exceptions.DuplicateException(
'Copr: "{0}" already exists'.format(copr.name))
signals.copr_created.send(cls, copr=copr)
@@ -86,15 +86,31 @@ class CoprsLogic(object):
@classmethod
def update(cls, user, copr, check_for_duplicates = True):
- if check_for_duplicates and cls.exists_for_current_user(user, copr.name).all():
- raise exceptions.DuplicateException(
- 'Copr: "{0}" already exists'.format(copr.name))
+ action = cls.unfinished_actions(user, copr).first()
+ if action:
+ raise exceptions.ActionInProgressException('Action in progress on this copr.', action)
+
+ existing = cls.exists_for_user(copr.owner, copr.name).first()
+ if existing:
+ if check_for_duplicates and existing.id != copr.id:
+ raise exceptions.DuplicateException('Copr: "{0}" already exists'.format(copr.name))
+ else: # we're renaming
+ # if we fire a models.Copr.query, it will use the modified copr in session
+ # -> workaround this by just getting the name
+ old_copr_name = db.session.query(models.Copr.name).filter(models.Copr.id==copr.id).first()[0]
+ action = models.Action(action_type='rename',
+ object_type='copr',
+ object_id=copr.id,
+ old_value='{0}/{1}'.format(copr.owner.name, old_copr_name),
+ new_value='{0}/{1}'.format(copr.owner.name, copr.name),
+ created_on=int(time.time()))
+ db.session.add(action)
db.session.add(copr)
@classmethod
- def exists_for_current_user(cls, user, coprname):
- existing = models.Copr.query.filter(models.Copr.name == coprname).\
- filter(models.Copr.owner_id == user.id)
+ def exists_for_user(cls, user, coprname):
+ existing = models.Copr.query.filter(models.Copr.name==coprname).\
+ filter(models.Copr.owner_id==user.id)
return existing
@@ -103,6 +119,14 @@ class CoprsLogic(object):
models.Copr.query.filter(models.Copr.id == copr.id).\
update({models.Copr.build_count: models.Copr.build_count + 1})
+ @classmethod
+ def unfinished_actions(cls, user, copr):
+ actions = models.Action.query.filter(models.Action.object_type=='copr').\
+ filter(models.Action.object_id==copr.id).\
+ filter(models.Action.backend_result==0)
+
+ return actions
+
class CoprPermissionsLogic(object):
@classmethod
def get(cls, user, copr, searched_user):
diff --git a/coprs_frontend/coprs/models.py b/coprs_frontend/coprs/models.py
index 0f81c85..8c20f86 100644
--- a/coprs_frontend/coprs/models.py
+++ b/coprs_frontend/coprs/models.py
@@ -1,4 +1,5 @@
import datetime
+import time
import sqlalchemy
from sqlalchemy.ext.associationproxy import association_proxy
@@ -211,3 +212,32 @@ class CoprChroot(db.Model, Serializer):
copr = db.relationship('Copr', backref = db.backref('copr_chroots',
single_parent=True,
cascade='all,delete,delete-orphan'))
+
+class Action(db.Model, Serializer):
+ id = db.Column(db.Integer, primary_key=True)
+ # delete, rename,
+ action_type = db.Column(db.Integer, nullable=False)
+ # copr,
+ object_type = db.Column(db.String(20))
+ object_id = db.Column(db.Integer)
+ old_value = db.Column(db.String(255))
+ new_value = db.Column(db.String(255))
+ backend_result = db.Column(db.Integer, default=helpers.BackendResultEnum('waiting'))
+ backend_message = db.Column(db.Text)
+ created_on = db.Column(db.Integer)
+
+ def __str__(self):
+ return self.__unicode__()
+
+ def __unicode__(self):
+ if self.action_type == 'delete':
+ return 'Deleting {0} {1}'.format(self.object_type, self.old_value)
+ elif self.action_type == 'rename':
+ return 'Renaming {0} from {1} to {2}.'.format(self.object_type,
+ self.old_value,
+ self.new_value)
+
+ return 'Action {0} on {1}, old value: {2}, new value: {3}.'.format(self.action_type,
+ self.object_type,
+ self.old_value,
+ self.new_value)
diff --git a/coprs_frontend/coprs/views/coprs_ns/coprs_general.py b/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
index fb00e4c..fc1a0ad 100644
--- a/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
+++ b/coprs_frontend/coprs/views/coprs_ns/coprs_general.py
@@ -177,10 +177,16 @@ def copr_update(username, coprname):
copr.instructions = form.instructions.data
coprs_logic.CoprChrootsLogic.update_from_names(flask.g.user, copr, form.selected_chroots)
- coprs_logic.CoprsLogic.update(flask.g.user, copr, check_for_duplicates = False) # form validation checks for duplicates
- db.session.commit()
- flask.flash('Copr was updated successfully.')
- return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = username, coprname = form.name.data))
+ try:
+ coprs_logic.CoprsLogic.update(flask.g.user, copr, check_for_duplicates = False) # form validation checks for duplicates
+ except exceptions.ActionInProgressException as e:
+ flask.flash('Can\'t change this Copr name, there is another operation in progress: {0}'.format(e.action))
+ db.session.rollback()
+ else:
+ flask.flash('Copr was updated successfully.')
+ db.session.commit()
+
+ return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = username, coprname = copr.name))
else:
return copr_edit(username, coprname, form)
10 years, 3 months
[copr] master: Now that sql_custom module doesn't exist, mock it's behaviour in the old migration (e3e5065)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit e3e5065c9e564f8a8016970cf70c8cbce2c4ba8a
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Wed Feb 20 11:18:05 2013 +0100
Now that sql_custom module doesn't exist, mock it's behaviour in the old migration
>---------------------------------------------------------------
.../versions/3a035889852c_add_copr_fulltext.py | 15 +++++++++++++--
1 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/coprs_frontend/alembic/versions/3a035889852c_add_copr_fulltext.py b/coprs_frontend/alembic/versions/3a035889852c_add_copr_fulltext.py
index 8fa6a5e..674e06e 100644
--- a/coprs_frontend/alembic/versions/3a035889852c_add_copr_fulltext.py
+++ b/coprs_frontend/alembic/versions/3a035889852c_add_copr_fulltext.py
@@ -12,12 +12,23 @@ down_revision = '3c3cce7a5fe0'
from alembic import op
import sqlalchemy as sa
+from sqlalchemy import types
+from sqlalchemy.ext import compiler
-from coprs import sql_custom
+class Tsvector(types.UnicodeText):
+ pass
+
+(a)compiler.compiles(Tsvector, 'postgresql')
+def compile_tsvector(element, compiler, **kw):
+ return 'tsvector'
+
+(a)compiler.compiles(Tsvector, 'sqlite')
+def compile_tsvector(element, compiler, **kw):
+ return 'text'
def upgrade():
### commands auto generated by Alembic - please adjust! ###
- op.add_column('copr', sa.Column('copr_ts_col', sql_custom.Tsvector(), nullable=True))
+ op.add_column('copr', sa.Column('copr_ts_col', Tsvector(), nullable=True))
op.create_index('copr_ts_idx', 'copr', ['copr_ts_col'], postgresql_using='gin')
session = sa.orm.sessionmaker(bind=op.get_bind())()
10 years, 3 months
[copr] master: Fine tune the manage.py test command (aafb0e6)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit aafb0e677ba3e6cfa222d55e84e85a1d25cc2277
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Wed Feb 20 08:58:41 2013 +0100
Fine tune the manage.py test command
>---------------------------------------------------------------
coprs_frontend/manage.py | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/coprs_frontend/manage.py b/coprs_frontend/manage.py
index f4054fc..1b798e9 100755
--- a/coprs_frontend/manage.py
+++ b/coprs_frontend/manage.py
@@ -16,7 +16,8 @@ from coprs.logic import coprs_logic
class TestCommand(Command):
def run(self, test_args):
os.environ['COPRS_ENVIRON_UNITTEST'] = '1'
- subprocess.call(['py.test'] + test_args)
+ os.environ['PYTHONPATH'] = '.'
+ subprocess.call(['py.test'] + (test_args or []))
option_list = (
Option('-a',
10 years, 3 months
[copr] master: Add a test command to manage.py (5d27203)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 5d27203df35e09ef19f36230321c8460bd74bd20
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Tue Feb 19 14:28:32 2013 +0100
Add a test command to manage.py
>---------------------------------------------------------------
coprs_frontend/manage.py | 14 ++++++++++++++
coprs_frontend/tests/coprs_test_case.py | 1 -
2 files changed, 14 insertions(+), 1 deletions(-)
diff --git a/coprs_frontend/manage.py b/coprs_frontend/manage.py
index 01c5616..f4054fc 100755
--- a/coprs_frontend/manage.py
+++ b/coprs_frontend/manage.py
@@ -1,6 +1,8 @@
#!/usr/bin/env python
+import argparse
import os
+import subprocess
import flask
from flask.ext.script import Manager, Command, Option, Group
@@ -11,6 +13,17 @@ from coprs import exceptions
from coprs import models
from coprs.logic import coprs_logic
+class TestCommand(Command):
+ def run(self, test_args):
+ os.environ['COPRS_ENVIRON_UNITTEST'] = '1'
+ subprocess.call(['py.test'] + test_args)
+
+ option_list = (
+ Option('-a',
+ dest='test_args',
+ nargs=argparse.REMAINDER),
+ )
+
class CreateSqliteFileCommand(Command):
'Create the sqlite DB file (not the tables). Used for alembic, "create_db" does this automatically.'
def run(self):
@@ -162,6 +175,7 @@ class AlterUserCommand(Command):
)
manager = Manager(app)
+manager.add_command('test', TestCommand())
manager.add_command('create_sqlite_file', CreateSqliteFileCommand())
manager.add_command('create_db', CreateDBCommand())
manager.add_command('drop_db', DropDBCommand())
diff --git a/coprs_frontend/tests/coprs_test_case.py b/coprs_frontend/tests/coprs_test_case.py
index 2028401..82e7a38 100644
--- a/coprs_frontend/tests/coprs_test_case.py
+++ b/coprs_frontend/tests/coprs_test_case.py
@@ -1,6 +1,5 @@
import base64
import os
-os.environ['COPRS_ENVIRON_UNITTEST'] = '1'
import pytest
10 years, 3 months