[copr] master: Handle PermissionsEnum better (19ef32c)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 19ef32c10a24800d5ed7e7ac9559ccb029d8fb4d
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Tue Feb 19 13:53:07 2013 +0100
Handle PermissionsEnum better
>---------------------------------------------------------------
coprs_frontend/coprs/filters.py | 2 +-
coprs_frontend/coprs/forms.py | 8 +++---
coprs_frontend/coprs/helpers.py | 22 ++++++++++----------
coprs_frontend/coprs/logic/coprs_logic.py | 6 ++--
coprs_frontend/coprs/models.py | 4 +-
coprs_frontend/tests/coprs_test_case.py | 6 ++--
.../tests/test_views/test_coprs_ns/test_general.py | 8 +++---
7 files changed, 28 insertions(+), 28 deletions(-)
diff --git a/coprs_frontend/coprs/filters.py b/coprs_frontend/coprs/filters.py
index 5cbdb75..12374b6 100644
--- a/coprs_frontend/coprs/filters.py
+++ b/coprs_frontend/coprs/filters.py
@@ -9,7 +9,7 @@ def date_from_secs(secs):
@app.template_filter('perm_type_from_num')
def perm_type_from_num(num):
- return helpers.PermissionEnum.key(num)
+ return helpers.PermissionEnum(num)
# this should probably be stored in DB with the whole mock_chroot...
@app.template_filter('os_name_short')
diff --git a/coprs_frontend/coprs/forms.py b/coprs_frontend/coprs/forms.py
index e5038f2..6d14b60 100644
--- a/coprs_frontend/coprs/forms.py
+++ b/coprs_frontend/coprs/forms.py
@@ -61,8 +61,8 @@ class StringListFilter(object):
class ValueToPermissionNumberFilter(object):
def __call__(self, value):
if value:
- return helpers.PermissionEnum.num('request')
- return helpers.PermissionEnum.num('nothing')
+ return helpers.PermissionEnum('request')
+ return helpers.PermissionEnum('nothing')
class CoprFormFactory(object):
@staticmethod
@@ -146,9 +146,9 @@ class PermissionsApplierFormFactory(object):
admin_default = False
if permission:
- if permission.copr_builder != helpers.PermissionEnum.num('nothing'):
+ if permission.copr_builder != helpers.PermissionEnum('nothing'):
builder_default = True
- if permission.copr_admin != helpers.PermissionEnum.num('nothing'):
+ if permission.copr_admin != helpers.PermissionEnum('nothing'):
admin_default = True
setattr(F, 'copr_builder', wtf.BooleanField(default = builder_default, filters = [ValueToPermissionNumberFilter()]))
diff --git a/coprs_frontend/coprs/helpers.py b/coprs_frontend/coprs/helpers.py
index 6cb7c16..ac105ec 100644
--- a/coprs_frontend/coprs/helpers.py
+++ b/coprs_frontend/coprs/helpers.py
@@ -17,21 +17,21 @@ def generate_api_token(size=30):
return ''.join(random.choice(string.ascii_lowercase) for x in range(size))
+class EnumType(type):
+ def __call__(self, attr):
+ if isinstance(attr, int):
+ for k, v in self.vals.items():
+ if v == attr:
+ return k
+ raise KeyError('num {0} is not mapped'.format(attr))
+ else:
+ return self.vals[attr]
+
class PermissionEnum(object):
+ __metaclass__ = EnumType
vals = {'nothing': 0, 'request': 1, 'approved': 2}
@classmethod
- def num(cls, key):
- return cls.vals[key]
-
- @classmethod
- def key(cls, num):
- for k, n in cls.vals.items():
- if n == num:
- return k
- raise KeyError('num {0} is not mapped'.format(num))
-
- @classmethod
def choices_list(cls, without = -1):
return [(n, k) for k, n in cls.vals.items() if n != without]
diff --git a/coprs_frontend/coprs/logic/coprs_logic.py b/coprs_frontend/coprs/logic/coprs_logic.py
index f124006..aee017d 100644
--- a/coprs_frontend/coprs/logic/coprs_logic.py
+++ b/coprs_frontend/coprs/logic/coprs_logic.py
@@ -44,7 +44,7 @@ class CoprsLogic(object):
elif user_relation == 'allowed':
aliased_user = db.aliased(models.User)
query = query.join(models.CoprPermission, models.Copr.copr_permissions).\
- filter(models.CoprPermission.copr_builder == helpers.PermissionEnum.num('approved')).\
+ filter(models.CoprPermission.copr_builder == helpers.PermissionEnum('approved')).\
join(aliased_user, models.CoprPermission.user).\
filter(aliased_user.openid_name == models.User.openidize_name(username))
if with_mock_chroots:
@@ -132,9 +132,9 @@ class CoprPermissionsLogic(object):
def update_permissions_by_applier(cls, user, copr, copr_permission, new_builder, new_admin):
if copr_permission:
# preserve approved permissions if set
- if not new_builder or copr_permission.copr_builder != helpers.PermissionEnum.num('approved'):
+ if not new_builder or copr_permission.copr_builder != helpers.PermissionEnum('approved'):
copr_permission.copr_builder = new_builder
- if not new_admin or copr_permission.copr_admin != helpers.PermissionEnum.num('approved'):
+ if not new_admin or copr_permission.copr_admin != helpers.PermissionEnum('approved'):
copr_permission.copr_admin = new_admin
else:
perm = models.CoprPermission(user = user, copr = copr, copr_builder = new_builder, copr_admin = new_admin)
diff --git a/coprs_frontend/coprs/models.py b/coprs_frontend/coprs/models.py
index 81d23df..0f81c85 100644
--- a/coprs_frontend/coprs/models.py
+++ b/coprs_frontend/coprs/models.py
@@ -78,7 +78,7 @@ class User(db.Model, Serializer):
can_build = False
if copr.owner == self:
can_build = True
- if self.permissions_for_copr(copr) and self.permissions_for_copr(copr).copr_builder == helpers.PermissionEnum.num('approved'):
+ if self.permissions_for_copr(copr) and self.permissions_for_copr(copr).copr_builder == helpers.PermissionEnum('approved'):
can_build = True
return can_build
@@ -87,7 +87,7 @@ class User(db.Model, Serializer):
can_edit = False
if copr.owner == self:
can_edit = True
- if self.permissions_for_copr(copr) and self.permissions_for_copr(copr).copr_admin == helpers.PermissionEnum.num('approved'):
+ if self.permissions_for_copr(copr) and self.permissions_for_copr(copr).copr_admin == helpers.PermissionEnum('approved'):
can_edit = True
return can_edit
diff --git a/coprs_frontend/tests/coprs_test_case.py b/coprs_frontend/tests/coprs_test_case.py
index 7756343..2028401 100644
--- a/coprs_frontend/tests/coprs_test_case.py
+++ b/coprs_frontend/tests/coprs_test_case.py
@@ -92,8 +92,8 @@ class CoprsTestCase(object):
@pytest.fixture
def f_copr_permissions(self):
- self.cp1 = models.CoprPermission(copr = self.c2, user = self.u1, copr_builder = helpers.PermissionEnum.num('approved'), copr_admin = helpers.PermissionEnum.num('nothing'))
- self.cp2 = models.CoprPermission(copr = self.c3, user = self.u3, copr_builder = helpers.PermissionEnum.num('nothing'), copr_admin = helpers.PermissionEnum.num('nothing'))
- self.cp3 = models.CoprPermission(copr = self.c3, user = self.u1, copr_builder = helpers.PermissionEnum.num('request'), copr_admin = helpers.PermissionEnum.num('approved'))
+ self.cp1 = models.CoprPermission(copr = self.c2, user = self.u1, copr_builder = helpers.PermissionEnum('approved'), copr_admin = helpers.PermissionEnum('nothing'))
+ self.cp2 = models.CoprPermission(copr = self.c3, user = self.u3, copr_builder = helpers.PermissionEnum('nothing'), copr_admin = helpers.PermissionEnum('nothing'))
+ 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])
diff --git a/coprs_frontend/tests/test_views/test_coprs_ns/test_general.py b/coprs_frontend/tests/test_views/test_coprs_ns/test_general.py
index 572bfef..691276f 100644
--- a/coprs_frontend/tests/test_views/test_coprs_ns/test_general.py
+++ b/coprs_frontend/tests/test_views/test_coprs_ns/test_general.py
@@ -351,14 +351,14 @@ class TestCoprUpdatePermissions(CoprsTestCase):
u1_c3_perms = self.models.CoprPermission.query.filter(self.models.CoprPermission.copr_id == self.c3.id).\
filter(self.models.CoprPermission.user_id == self.u1.id).\
first()
- assert u1_c3_perms.copr_builder == self.helpers.PermissionEnum.num('approved')
- assert u1_c3_perms.copr_admin == self.helpers.PermissionEnum.num('request')
+ assert u1_c3_perms.copr_builder == self.helpers.PermissionEnum('approved')
+ assert u1_c3_perms.copr_admin == self.helpers.PermissionEnum('request')
u3_c3_perms = self.models.CoprPermission.query.filter(self.models.CoprPermission.copr_id == self.c3.id).\
filter(self.models.CoprPermission.user_id == self.u3.id).\
first()
- assert u3_c3_perms.copr_builder == self.helpers.PermissionEnum.num('nothing')
- assert u3_c3_perms.copr_admin == self.helpers.PermissionEnum.num('approved')
+ assert u3_c3_perms.copr_builder == self.helpers.PermissionEnum('nothing')
+ assert u3_c3_perms.copr_admin == self.helpers.PermissionEnum('approved')
def test_copr_admin_can_update_permissions(self, f_users, f_coprs, f_copr_permissions, f_db):
with self.tc as c:
11 years, 2 months
[copr] master: Remove TODO, we're tracking this via tickets anyway (54cb609)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 54cb6098471a8f5812baab6cf60dde370930f392
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Mon Feb 18 14:20:51 2013 +0100
Remove TODO, we're tracking this via tickets anyway
>---------------------------------------------------------------
coprs_frontend/TODO | 5 -----
1 files changed, 0 insertions(+), 5 deletions(-)
diff --git a/coprs_frontend/TODO b/coprs_frontend/TODO
deleted file mode 100644
index b0b324f..0000000
--- a/coprs_frontend/TODO
+++ /dev/null
@@ -1,5 +0,0 @@
-- Query optimization
-- Admin area (making users proven and admins)
-- Personal area (changing email)
-- Sending emails with important info?
-- Logging
11 years, 2 months
[copr] master: Move the try/except into the main() function (c4265f5)
by Pierre-YvesChibon
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit c4265f5aad8dca51c9f80eabefa146186192bfe1
Author: Pierre-Yves Chibon <pingou(a)pingoured.fr>
Date: Mon Feb 18 18:53:05 2013 +0100
Move the try/except into the main() function
This is necessary if we want the try/except to have some kind of effect when copr-cli
is installed (since setup.py uses entry_point).
>---------------------------------------------------------------
copr_cli/main.py | 18 +++++++++---------
1 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/copr_cli/main.py b/copr_cli/main.py
index 15bfb02..0a68128 100644
--- a/copr_cli/main.py
+++ b/copr_cli/main.py
@@ -102,16 +102,12 @@ def setup_parser():
def main(argv=sys.argv[1:]):
""" Main function """
- # Set up parser for global args
- parser = setup_parser()
- # Parse the commandline
- arg = parser.parse_args()
- arg.func(arg)
-
-
-if __name__ == '__main__':
try:
- main()
+ # Set up parser for global args
+ parser = setup_parser()
+ # Parse the commandline
+ arg = parser.parse_args()
+ arg.func(arg)
except KeyboardInterrupt:
print "\nInterrupted by user."
sys.exit(1)
@@ -121,3 +117,7 @@ if __name__ == '__main__':
except Exception, e:
print 'Error: {0}'.format(e)
sys.exit(100)
+
+
+if __name__ == '__main__':
+ main()
11 years, 2 months
[copr] master: Rework copr-cli (fc27328)
by Pierre-YvesChibon
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit fc27328a0e504876e4efad6df212c28b8ce0cd80
Author: Pierre-Yves Chibon <pingou(a)pingoured.fr>
Date: Sun Feb 17 15:23:00 2013 +0100
Rework copr-cli
This commit restructure copr-cli by removing cliff from it and thus making it a simple
argparse based python program using subparser
This removes complexicity as well as the dependency on cliff.
Move the URL to copr into the config file.
This way one can use another copr server than the one provided by the Fedora Project.
Rename the function set_user to get_user, semantically more appropriate.
>---------------------------------------------------------------
copr_cli/main.py | 159 ++++++++++++++++++++----------
copr_cli/subcommands.py | 257 ++++++++++++++++++++++++-----------------------
coprcli-setup.py | 27 +----
3 files changed, 244 insertions(+), 199 deletions(-)
diff --git a/copr_cli/main.py b/copr_cli/main.py
index 350fdf8..15bfb02 100644
--- a/copr_cli/main.py
+++ b/copr_cli/main.py
@@ -1,68 +1,123 @@
#-*- coding: UTF-8 -*-
-import logging
+import argparse
import sys
-
-import cliff.app
-import cliff.commandmanager
-from cliff.commandmanager import CommandManager
+import subcommands
__version__ = '0.1.0'
__description__ = "CLI tool to run copr"
-copr_url = 'http://copr-fe.cloud.fedoraproject.org/'
-copr_api_url = '{0}/api'.format(copr_url)
-
-
-class CoprCli(cliff.app.App):
-
- log = logging.getLogger(__name__)
-
- def __init__(self):
- manager = cliff.commandmanager.CommandManager('copr_cli.subcommands')
- super(CoprCli, self).__init__(
- description=__description__,
- version=__version__,
- command_manager=manager,
- )
- requests_log = logging.getLogger("requests")
- requests_log.setLevel(logging.WARN)
-
- def initialize_app(self, argv):
- self.log.debug('initialize_app')
-
- def prepare_to_run_command(self, cmd):
- self.log.debug('prepare_to_run_command %s', cmd.__class__.__name__)
-
- def clean_up(self, cmd, result, err):
- self.log.debug('clean_up %s', cmd.__class__.__name__)
- if err:
- self.log.debug('got an error: %s', err)
-
- # Overload run_subcommand to gracefully handle unknown commands.
- def run_subcommand(self, argv):
- try:
- self.command_manager.find_command(argv)
- except ValueError as e:
- if "Unknown command" in str(e):
- print "%r is an unknown command" % ' '.join(argv)
- print "Try \"copr -h\""
- sys.exit(1)
- else:
- raise
- return super(CoprCli, self).run_subcommand(argv)
+def action_build(args):
+ """ Method called when the 'build' action has been selected by the
+ user.
+
+ :param args: argparse arguments provided by the user
+
+ """
+ subcommands.build(args.copr, args.pkgs,
+ args.memory, args.timeout)
+
+
+def action_create(args):
+ """ Method called when the 'create' action has been selected by the
+ user.
+
+ :param args: argparse arguments provided by the user
+
+ """
+ subcommands.create(args.name, args.chroots, args.description,
+ args.instructions, args.repos,
+ args.initial_pkgs)
+
+
+def action_list(args):
+ """ Method called when the 'list' action has been selected by the
+ user.
+
+ :param args: argparse arguments provided by the user
+
+ """
+ subcommands.list(args.username)
+
+
+def setup_parser():
+ """
+ Set the main arguments.
+ """
+ parser = argparse.ArgumentParser(prog="copr-cli")
+ # General connection options
+ parser.add_argument('--version', action='version',
+ version='copr-cli %s' % (__version__))
+
+ subparsers = parser.add_subparsers(title='actions')
+
+ # create the parser for the "list" command
+ parser_list = subparsers.add_parser('list',
+ help='List all the copr of the '
+ 'provided '
+ )
+ parser_list.add_argument("username", nargs='?',
+ help='The username that you would like to '
+ 'list the copr of (defaults to current user)'
+ )
+ parser_list.set_defaults(func=action_list)
+
+ # create the parser for the "create" command
+ parser_create = subparsers.add_parser('create',
+ help='Create a new copr')
+ parser_create.add_argument('name',
+ help='The name of the copr to create')
+ parser_create.add_argument("--chroot", dest="chroots", action='append',
+ help="Chroot to use for this copr")
+ parser_create.add_argument('--repo', dest='repos', action='append',
+ help="Repository to add to this copr")
+ parser_create.add_argument('--initial-pkgs', dest='initial_pkgs',
+ action='append',
+ help="List of packages to build in this "
+ "new copr")
+ parser_create.add_argument('--description',
+ help="Description of the copr")
+ parser_create.add_argument('--instructions',
+ help="Instructions for the copr")
+ parser_create.set_defaults(func=action_create)
+
+ # create the parser for the "build" command
+ parser_build = subparsers.add_parser('build',
+ help='Build packages to a '
+ 'specified copr')
+ parser_build.add_argument('copr',
+ help='The copr repo to build the package in'
+ )
+ parser_build.add_argument('pkgs', nargs='+', action='append')
+ parser_build.add_argument('--memory', dest='memory',
+ help="")
+ parser_build.add_argument('--timeout', dest='timeout',
+ help="")
+ parser_build.set_defaults(func=action_build)
+
+ return parser
def main(argv=sys.argv[1:]):
""" Main function """
- myapp = CoprCli()
- return myapp.run(argv)
+ # Set up parser for global args
+ parser = setup_parser()
+ # Parse the commandline
+ arg = parser.parse_args()
+ arg.func(arg)
if __name__ == '__main__':
- sys.exit(main(sys.argv[1:]))
- #add_copr('test2', 'fedora-rawhide-x86_64',
- #description='Test repos #2')
- #list_copr()
+ try:
+ main()
+ except KeyboardInterrupt:
+ print "\nInterrupted by user."
+ sys.exit(1)
+ except argparse.ArgumentTypeError, e:
+ print "\nError: {0}".format(e)
+ sys.exit(2)
+ except Exception, e:
+ print 'Error: {0}'.format(e)
+ sys.exit(100)
diff --git a/copr_cli/subcommands.py b/copr_cli/subcommands.py
index c0013db..1d561ee 100644
--- a/copr_cli/subcommands.py
+++ b/copr_cli/subcommands.py
@@ -2,20 +2,13 @@
import ConfigParser
import json
-import logging
-import requests
import os
import sys
-import cliff.lister
-import cliff.show
-
-from cliff.command import Command
-
-from main import copr_api_url
+import requests
-def set_user():
+def get_user():
""" Retrieve the user information from the config file. """
config = ConfigParser.ConfigParser()
config.read(os.path.join(os.path.expanduser('~'), '.config',
@@ -25,124 +18,138 @@ def set_user():
return {'username': username, 'token': token}
-class List(cliff.lister.Lister):
- """ List all the copr of a user. """
+def get_api_url():
+ """ Retrieve the user information from the config file. """
+ config = ConfigParser.ConfigParser(
+ {'copr_url': 'http://copr-fe.cloud.fedoraproject.org'})
+ config.read(os.path.join(os.path.expanduser('~'), '.config',
+ 'copr'))
+ copr_url = config.get('copr-cli', 'copr_url')
+ return '%s/api' % copr_url
- log = logging.getLogger(__name__)
-
- def get_parser(self, prog_name):
- parser = super(type(self), self).get_parser(prog_name)
- parser.add_argument("username", nargs='?')
- return parser
-
- def take_action(self, args):
- user = set_user()
-
- if args.username:
- user['username'] = args.username
- URL = '{0}/owned/'.format(copr_api_url)
- req = requests.get(URL, params=user)
- output = json.loads(req.text)
- if 'repos' in output:
- if output['repos']:
- columns = ['name', 'description', 'repos', 'instructions']
- values = []
- for entry in output['repos']:
- values.append([entry[key] for key in columns])
- return (columns, values)
- else:
- columns = ['output']
- values = ['No copr retrieved for user: "{0}"'.format(
- user['username'])]
- return (columns, [values])
+
+def list(username=None):
+ """ List all the copr of a user. """
+ user = get_user()
+ copr_api_url = get_api_url()
+ url = '{0}/owned/'.format(copr_api_url)
+
+ if username:
+ user['username'] = username
+ del(user['token'])
+
+ req = requests.get(url, params=user)
+ output = json.loads(req.text)
+ columns = []
+ values = []
+ if 'repos' in output:
+ if output['repos']:
+ columns = ['name', 'description', 'repos', 'instructions']
+ values = []
+ for entry in output['repos']:
+ values.append([entry[key] for key in columns])
else:
columns = ['output']
- values = ['Wrong output format returned by the server']
- return (columns, [values])
-
-
-class AddCopr(Command):
+ values = ['No copr retrieved for user: "{0}"'.format(
+ user['username'])]
+ else:
+ columns = ['output']
+ values = ['Wrong output format returned by the server']
+
+ def _list_to_row(values, widths):
+ ''' Return a print ready version of the provided list '''
+ row = []
+ cnt = 0
+ for item in values:
+ max_width = widths[cnt]
+ cnt += 1
+ if not item:
+ item = ''
+ if cnt < len(values):
+ row.append(item.ljust(max_width + 1))
+ else:
+ row.append(item)
+ return row
+
+ if len(columns) > 1:
+ widths = {}
+ cnt = 0
+ for item in columns:
+ widths[cnt] = len(item)
+ cnt += 1
+ for row in values:
+ cnt = 0
+ for item in row:
+ if not item:
+ item = ''
+ widths[cnt] = max(widths[cnt], len(item))
+ cnt += 1
+
+ headers = '|'.join(_list_to_row(columns, widths))
+ print headers
+ print '-' * len(headers)
+ for row in values:
+ print "|".join(_list_to_row(row, widths))
+
+ else:
+ max_width = len(values[0])
+ headers = columns[0]
+ print headers
+ print "-"*len(headers)
+ print values[0]
+
+
+def create(name, chroots=[], description=None, instructions=None,
+ repos=None, initial_pkgs=None):
""" Create a new copr. """
-
- log = logging.getLogger(__name__)
-
- def get_parser(self, prog_name):
- parser = super(type(self), self).get_parser(prog_name)
- parser.add_argument("name")
- parser.add_argument("--chroot", dest="chroots", action='append',
- help="")
- parser.add_argument('--repo', dest='repos', action='append',
- help="")
- parser.add_argument('--initial-pkgs', dest='initial_pkgs',
- action='append',
- help="")
- parser.add_argument('--description',
- help="")
- parser.add_argument('--instructions',
- help="")
- return parser
-
- def take_action(self, args):
- user = set_user()
- URL = '{0}/copr/new/'.format(copr_api_url)
-
- repos = None
- if args.repos:
- repos = ' '.join(args.repos)
- initial_pkgs = None
- if args.initial_pkgs:
- initial_pkgs = ' '.join(args.initial_pkgs)
- data = {'name': args.name,
- 'repos': repos,
- 'initial_pkgs': initial_pkgs,
- 'description': args.description,
- 'instructions': args.instructions
- }
- for chroot in args.chroots:
- data[chroot] = 'y'
-
- req = requests.post(URL,
- auth=(user['username'], user['token']),
- data=data)
- output = json.loads(req.text)
- if output['output'] == 'ok':
- print output['message']
- else:
- print 'Something went wrong:\n {0}'.format(output['error'])
-
-
-class Build(Command):
+ user = get_user()
+ copr_api_url = get_api_url()
+ URL = '{0}/copr/new/'.format(copr_api_url)
+
+ repos = None
+ if type(repos) == list():
+ repos = ' '.join(repos)
+ initial_pkgs = None
+ if type(initial_pkgs) == list():
+ initial_pkgs = ' '.join(initial_pkgs)
+ data = {'name': name,
+ 'repos': repos,
+ 'initial_pkgs': initial_pkgs,
+ 'description': description,
+ 'instructions': instructions
+ }
+ for chroot in chroots:
+ data[chroot] = 'y'
+
+ req = requests.post(URL,
+ auth=(user['username'], user['token']),
+ data=data)
+ output = json.loads(req.text)
+ if output['output'] == 'ok':
+ print output['message']
+ else:
+ print 'Something went wrong:\n {0}'.format(output['error'])
+
+
+def build(copr, pkgs, memory, timeout):
""" Build a new package into a given copr. """
-
- log = logging.getLogger(__name__)
-
- def get_parser(self, prog_name):
- parser = super(type(self), self).get_parser(prog_name)
- parser.add_argument('copr')
- parser.add_argument('pkgs', nargs='+', action='append')
- parser.add_argument('--memory', dest='memory',
- help="")
- parser.add_argument('--timeout', dest='timeout',
- help="")
- return parser
-
- def take_action(self, args):
- user = set_user()
- URL = '{0}/coprs/detail/{1}/{2}/new_build/'.format(
- copr_api_url,
- user['username'],
- args.copr)
-
- data = {'pkgs': ' '.join(args.pkgs[0]),
- 'memory': args.memory,
- 'timeout': args.timeout
- }
-
- req = requests.post(URL,
- auth=(user['username'], user['token']),
- data=data)
- output = json.loads(req.text)
- if req.status_code != 200:
- print 'Something went wrong:\n {0}'.format(output['error'])
- else:
- print output['message']
+ user = get_user()
+ copr_api_url = get_api_url()
+ URL = '{0}/coprs/detail/{1}/{2}/new_build/'.format(
+ copr_api_url,
+ user['username'],
+ copr)
+
+ data = {'pkgs': ' '.join(pkgs),
+ 'memory': memory,
+ 'timeout': timeout
+ }
+
+ req = requests.post(URL,
+ auth=(user['username'], user['token']),
+ data=data)
+ output = json.loads(req.text)
+ if req.status_code != 200:
+ print 'Something went wrong:\n {0}'.format(output['error'])
+ else:
+ print output['message']
diff --git a/coprcli-setup.py b/coprcli-setup.py
index 0084494..ed7eb57 100644
--- a/coprcli-setup.py
+++ b/coprcli-setup.py
@@ -1,11 +1,6 @@
-#!/usr/bin/env python
+#!/usr/bin/python
-try:
- from setuptools import setup
-except ImportError:
- from ez_setup import use_setuptools
- use_setuptools()
- from setuptools import setup
+from setuptools import setup
import sys
@@ -13,25 +8,13 @@ f = open('README')
long_description = f.read().strip()
f.close()
-# Ridiculous as it may seem, we need to import multiprocessing and
-# logging here in order to get tests to pass smoothly on python 2.7.
-try:
- import multiprocessing
- import logging
-except ImportError:
- pass
from copr_cli.main import __description__, __version__
requires = [
- 'cliff',
+ 'requests',
]
-subcommands = [
- 'list = copr_cli.subcommands:List',
- 'add-copr = copr_cli.subcommands:AddCopr',
- 'build-copr = copr_cli.subcommands:Build',
-]
__name__ = 'copr-cli'
__version__ = __version__
@@ -40,6 +23,7 @@ __author__ = "Pierre-Yves Chibon"
__author_email__ = "pingou(a)pingoured.fr"
__url__ = "http://fedorahosted.org/copr/"
+
setup(
name=__name__,
version=__version__,
@@ -64,7 +48,6 @@ setup(
entry_points={
'console_scripts': [
'copr-cli = copr_cli.main:main'
- ],
- 'copr_cli.subcommands': subcommands,
+ ]
},
)
11 years, 2 months
[copr] master: No shebang for what does not go in /usr/bin (2786bda)
by Pierre-YvesChibon
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 2786bdadd460784fd7067a93c0154a4de529c0c6
Author: Pierre-Yves Chibon <pingou(a)pingoured.fr>
Date: Sun Feb 17 15:28:11 2013 +0100
No shebang for what does not go in /usr/bin
>---------------------------------------------------------------
copr_cli/main.py | 1 -
1 files changed, 0 insertions(+), 1 deletions(-)
diff --git a/copr_cli/main.py b/copr_cli/main.py
index a0c7a8a..350fdf8 100644
--- a/copr_cli/main.py
+++ b/copr_cli/main.py
@@ -1,4 +1,3 @@
-#!/usr/bin/python -tt
#-*- coding: UTF-8 -*-
import logging
11 years, 2 months
[copr] master: Remove the log file generated by cliff (85a9708)
by Pierre-YvesChibon
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 85a9708a8bffb420eda78d835b3bf78bf5e4bfee
Author: Pierre-Yves Chibon <pingou(a)pingoured.fr>
Date: Sun Feb 17 15:23:39 2013 +0100
Remove the log file generated by cliff
This log file should not have been in the git repo in the first place anyway.
>---------------------------------------------------------------
copr_cli/main.log | 5 -----
1 files changed, 0 insertions(+), 5 deletions(-)
diff --git a/copr_cli/main.log b/copr_cli/main.log
deleted file mode 100644
index e98f62a..0000000
--- a/copr_cli/main.log
+++ /dev/null
@@ -1,5 +0,0 @@
-[2013-01-27 14:15:46,649] DEBUG __main__ initialize_app
-[2013-01-27 14:16:02,242] DEBUG __main__ initialize_app
-[2013-01-27 14:16:33,725] DEBUG __main__ initialize_app
-[2013-01-27 14:16:57,768] DEBUG __main__ initialize_app
-[2013-01-27 14:30:07,034] DEBUG __main__ initialize_app
11 years, 2 months
[PATCH 1/4] Rework copr-cli
by Pierre-Yves Chibon
This commit restructure copr-cli by removing cliff from it and thus making it a simple
argparse based python program.
This removes complexicity as well as the dependency on cliff.
---
Ok, so here is a series of patch that remove the dependency to cliff, move the
url of the corp into the config file and do some cleaning.
Comments welcome on the part that removes the dependency on cliff.
Thanks,
Pierre
copr_cli/main.py | 153 +++++++++++++++++++++++++-------------
copr_cli/subcommands.py | 193 ++++++++++++++++++------------------------------
coprcli-setup.py | 27 ++-----
3 files changed, 179 insertions(+), 194 deletions(-)
diff --git a/copr_cli/main.py b/copr_cli/main.py
index a0c7a8a..a06e5b3 100644
--- a/copr_cli/main.py
+++ b/copr_cli/main.py
@@ -1,69 +1,120 @@
#!/usr/bin/python -tt
#-*- coding: UTF-8 -*-
-import logging
+import argparse
import sys
-
-import cliff.app
-import cliff.commandmanager
-from cliff.commandmanager import CommandManager
+import subcommands
__version__ = '0.1.0'
__description__ = "CLI tool to run copr"
-copr_url = 'http://copr-fe.cloud.fedoraproject.org/'
-copr_api_url = '{0}/api'.format(copr_url)
-
-
-class CoprCli(cliff.app.App):
-
- log = logging.getLogger(__name__)
-
- def __init__(self):
- manager = cliff.commandmanager.CommandManager('copr_cli.subcommands')
- super(CoprCli, self).__init__(
- description=__description__,
- version=__version__,
- command_manager=manager,
- )
- requests_log = logging.getLogger("requests")
- requests_log.setLevel(logging.WARN)
-
- def initialize_app(self, argv):
- self.log.debug('initialize_app')
-
- def prepare_to_run_command(self, cmd):
- self.log.debug('prepare_to_run_command %s', cmd.__class__.__name__)
-
- def clean_up(self, cmd, result, err):
- self.log.debug('clean_up %s', cmd.__class__.__name__)
- if err:
- self.log.debug('got an error: %s', err)
- # Overload run_subcommand to gracefully handle unknown commands.
- def run_subcommand(self, argv):
- try:
- self.command_manager.find_command(argv)
- except ValueError as e:
- if "Unknown command" in str(e):
- print "%r is an unknown command" % ' '.join(argv)
- print "Try \"copr -h\""
- sys.exit(1)
- else:
- raise
+COPR_URL = 'http://copr-fe.cloud.fedoraproject.org/'
+COPR_API_URL = '{0}/api'.format(COPR_URL)
+
+CMDLIST = ['create', 'build', 'list', 'info']
+
+
+def setup_parser():
+ """
+ Set the main arguments.
+ """
+ usage = "\nCommands: {0}".format(', '.join(CMDLIST))
+ parser = argparse.ArgumentParser(
+ usage="%(prog)s [global options] COMMAND [options]" + usage,
+ prog="copr-cli")
+ # General connection options
+ parser.add_argument('command', help='The type of action you '
+ 'would like to perform. Action must be one of %s. '
+ 'Run copr-cli <action> -h to get the help of this '
+ 'specific action.' %
+ ', '.join(CMDLIST))
+ parser.add_argument('argument', nargs=argparse.REMAINDER)
+ parser.add_argument('--version', action='version',
+ version='copr-cli %s' % (__version__))
+ return parser
+
+
+def setup_action_parser(action, last_args=None):
+ """
+ Parse the remaining argument for action specific arguments.
+
+ :arg action the action for which the rest of the arguments will be
+ parsed. Actions can be "acl" or "list".
+ """
+ parser = argparse.ArgumentParser(
+ usage="%(prog)s {0} [options]".format(action))
+
+ if action == 'Create':
+ parser.add_argument('name', help='The name of the copr to create')
+ parser.add_argument("--chroot", dest="chroots", action='append',
+ help="")
+ parser.add_argument('--repo', dest='repos', action='append',
+ help="")
+ parser.add_argument('--initial-pkgs', dest='initial_pkgs',
+ action='append',
+ help="")
+ parser.add_argument('--description',
+ help="")
+ parser.add_argument('--instructions',
+ help="")
+
+ elif action == 'list':
+ parser.add_argument("username", nargs='?',
+ help='The username that you would like to '
+ 'list the copr of (defaults to current user)')
+
+ elif action == 'build':
+ parser.add_argument('copr', help='The copr repo to build the '
+ 'package in')
+ parser.add_argument('pkgs', nargs='+', action='append')
+ parser.add_argument('--memory', dest='memory',
+ help="")
+ parser.add_argument('--timeout', dest='timeout',
+ help="")
+ return parser
- return super(CoprCli, self).run_subcommand(argv)
def main(argv=sys.argv[1:]):
""" Main function """
- myapp = CoprCli()
- return myapp.run(argv)
+ # Set up parser for global args
+ parser = setup_parser()
+ # Parse the commandline
+ arg = parser.parse_args()
+ # Get our action from these args
+ if arg.command in CMDLIST:
+ action = arg.command
+ else:
+ raise argparse.ArgumentTypeError(
+ "command must be one of: {0}".format(','.join(CMDLIST)))
+ # Parse action-specific args
+ action_parser = setup_action_parser(action, arg.argument)
+ args = action_parser.parse_args(arg.argument)
+
+ if action == "list":
+ subcommands.list(COPR_API_URL, args.username)
+
+ elif action == "create":
+ subcommands.create(COPR_API_URL, args.name, args.chroots,
+ args.description, args.instructions,
+ args.repos, args.initial_pkgs)
+
+ elif action == "build":
+ subcommands.build(COPR_API_URL, args.copr, args.pkgs,
+ args.memory, args.timeout)
if __name__ == '__main__':
- sys.exit(main(sys.argv[1:]))
- #add_copr('test2', 'fedora-rawhide-x86_64',
- #description='Test repos #2')
- #list_copr()
+ try:
+ main()
+ except KeyboardInterrupt:
+ print "\nInterrupted by user."
+ sys.exit(1)
+ except argparse.ArgumentTypeError, e:
+ print "\nError: {0}".format(e)
+ sys.exit(2)
+ except Exception, e:
+ print 'Error: {0}'.format(e)
+ sys.exit(100)
diff --git a/copr_cli/subcommands.py b/copr_cli/subcommands.py
index c0013db..f2cdd5b 100644
--- a/copr_cli/subcommands.py
+++ b/copr_cli/subcommands.py
@@ -2,18 +2,10 @@
import ConfigParser
import json
-import logging
import requests
import os
import sys
-import cliff.lister
-import cliff.show
-
-from cliff.command import Command
-
-from main import copr_api_url
-
def set_user():
""" Retrieve the user information from the config file. """
@@ -25,124 +17,83 @@ def set_user():
return {'username': username, 'token': token}
-class List(cliff.lister.Lister):
+def list(copr_api_url, username=None):
""" List all the copr of a user. """
-
- log = logging.getLogger(__name__)
-
- def get_parser(self, prog_name):
- parser = super(type(self), self).get_parser(prog_name)
- parser.add_argument("username", nargs='?')
- return parser
-
- def take_action(self, args):
- user = set_user()
-
- if args.username:
- user['username'] = args.username
- URL = '{0}/owned/'.format(copr_api_url)
- req = requests.get(URL, params=user)
- output = json.loads(req.text)
- if 'repos' in output:
- if output['repos']:
- columns = ['name', 'description', 'repos', 'instructions']
- values = []
- for entry in output['repos']:
- values.append([entry[key] for key in columns])
- return (columns, values)
- else:
- columns = ['output']
- values = ['No copr retrieved for user: "{0}"'.format(
- user['username'])]
- return (columns, [values])
+ user = set_user()
+
+ if username:
+ user['username'] = username
+
+ URL = '{0}/owned/'.format(copr_api_url)
+ req = requests.get(URL, params=user)
+ output = json.loads(req.text)
+ if 'repos' in output:
+ if output['repos']:
+ columns = ['name', 'description', 'repos', 'instructions']
+ values = []
+ for entry in output['repos']:
+ values.append([entry[key] for key in columns])
+ return (columns, values)
else:
columns = ['output']
- values = ['Wrong output format returned by the server']
+ values = ['No copr retrieved for user: "{0}"'.format(
+ user['username'])]
return (columns, [values])
+ else:
+ columns = ['output']
+ values = ['Wrong output format returned by the server']
+ return (columns, [values])
-class AddCopr(Command):
+def create(copr_api_url, name, chroots=[],description=None,
+ instructions=None, repos=None, initial_pkgs=None):
""" Create a new copr. """
-
- log = logging.getLogger(__name__)
-
- def get_parser(self, prog_name):
- parser = super(type(self), self).get_parser(prog_name)
- parser.add_argument("name")
- parser.add_argument("--chroot", dest="chroots", action='append',
- help="")
- parser.add_argument('--repo', dest='repos', action='append',
- help="")
- parser.add_argument('--initial-pkgs', dest='initial_pkgs',
- action='append',
- help="")
- parser.add_argument('--description',
- help="")
- parser.add_argument('--instructions',
- help="")
- return parser
-
- def take_action(self, args):
- user = set_user()
- URL = '{0}/copr/new/'.format(copr_api_url)
-
- repos = None
- if args.repos:
- repos = ' '.join(args.repos)
- initial_pkgs = None
- if args.initial_pkgs:
- initial_pkgs = ' '.join(args.initial_pkgs)
- data = {'name': args.name,
- 'repos': repos,
- 'initial_pkgs': initial_pkgs,
- 'description': args.description,
- 'instructions': args.instructions
- }
- for chroot in args.chroots:
- data[chroot] = 'y'
-
- req = requests.post(URL,
- auth=(user['username'], user['token']),
- data=data)
- output = json.loads(req.text)
- if output['output'] == 'ok':
- print output['message']
- else:
- print 'Something went wrong:\n {0}'.format(output['error'])
-
-
-class Build(Command):
+ user = set_user()
+ URL = '{0}/copr/new/'.format(copr_api_url)
+
+ repos = None
+ if type(repos) == list():
+ repos = ' '.join(repos)
+ initial_pkgs = None
+ if type(initial_pkgs) == list():
+ initial_pkgs = ' '.join(initial_pkgs)
+ data = {'name': name,
+ 'repos': repos,
+ 'initial_pkgs': initial_pkgs,
+ 'description': description,
+ 'instructions': instructions
+ }
+ for chroot in chroots:
+ data[chroot] = 'y'
+
+ req = requests.post(URL,
+ auth=(user['username'], user['token']),
+ data=data)
+ output = json.loads(req.text)
+ if output['output'] == 'ok':
+ print output['message']
+ else:
+ print 'Something went wrong:\n {0}'.format(output['error'])
+
+
+def build(copr_api_url, copr, pkgs, memory, timeout):
""" Build a new package into a given copr. """
-
- log = logging.getLogger(__name__)
-
- def get_parser(self, prog_name):
- parser = super(type(self), self).get_parser(prog_name)
- parser.add_argument('copr')
- parser.add_argument('pkgs', nargs='+', action='append')
- parser.add_argument('--memory', dest='memory',
- help="")
- parser.add_argument('--timeout', dest='timeout',
- help="")
- return parser
-
- def take_action(self, args):
- user = set_user()
- URL = '{0}/coprs/detail/{1}/{2}/new_build/'.format(
- copr_api_url,
- user['username'],
- args.copr)
-
- data = {'pkgs': ' '.join(args.pkgs[0]),
- 'memory': args.memory,
- 'timeout': args.timeout
- }
-
- req = requests.post(URL,
- auth=(user['username'], user['token']),
- data=data)
- output = json.loads(req.text)
- if req.status_code != 200:
- print 'Something went wrong:\n {0}'.format(output['error'])
- else:
- print output['message']
+ user = set_user()
+ URL = '{0}/coprs/detail/{1}/{2}/new_build/'.format(
+ copr_api_url,
+ user['username'],
+ copr)
+
+ data = {'pkgs': ' '.join(pkgs),
+ 'memory': memory,
+ 'timeout': timeout
+ }
+
+ req = requests.post(URL,
+ auth=(user['username'], user['token']),
+ data=data)
+ output = json.loads(req.text)
+ if req.status_code != 200:
+ print 'Something went wrong:\n {0}'.format(output['error'])
+ else:
+ print output['message']
diff --git a/coprcli-setup.py b/coprcli-setup.py
index 0084494..ed7eb57 100644
--- a/coprcli-setup.py
+++ b/coprcli-setup.py
@@ -1,11 +1,6 @@
-#!/usr/bin/env python
+#!/usr/bin/python
-try:
- from setuptools import setup
-except ImportError:
- from ez_setup import use_setuptools
- use_setuptools()
- from setuptools import setup
+from setuptools import setup
import sys
@@ -13,25 +8,13 @@ f = open('README')
long_description = f.read().strip()
f.close()
-# Ridiculous as it may seem, we need to import multiprocessing and
-# logging here in order to get tests to pass smoothly on python 2.7.
-try:
- import multiprocessing
- import logging
-except ImportError:
- pass
from copr_cli.main import __description__, __version__
requires = [
- 'cliff',
+ 'requests',
]
-subcommands = [
- 'list = copr_cli.subcommands:List',
- 'add-copr = copr_cli.subcommands:AddCopr',
- 'build-copr = copr_cli.subcommands:Build',
-]
__name__ = 'copr-cli'
__version__ = __version__
@@ -40,6 +23,7 @@ __author__ = "Pierre-Yves Chibon"
__author_email__ = "pingou(a)pingoured.fr"
__url__ = "http://fedorahosted.org/copr/"
+
setup(
name=__name__,
version=__version__,
@@ -64,7 +48,6 @@ setup(
entry_points={
'console_scripts': [
'copr-cli = copr_cli.main:main'
- ],
- 'copr_cli.subcommands': subcommands,
+ ]
},
)
--
1.8.1.2
11 years, 2 months
copr cli tool
by Seth Vidal
I was thinking about the cli tool we want, now that we have the api in
place to make it possible to submit from a cli.
to start with I was thinking of a simple tool that did a small number of
basic commands:
create coprname -r distro -r distro -r distro -a arch -a arch
--repo=somerepo --repo=somerepo -p pkgurl1 -p pkgurl2
-p pkgurl3
edit coprname (not sure what this would do yet)
info coprname (dumps out info like the returned urls of builds, number of
builds, etc)
build coprname pkgurl1 pkgurl2 pkgurl3
delete coprname
What do you think? Too broad? not broad enough?
-sv
11 years, 2 months
[copr] master: Add copr_created signal (045dce0)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 045dce0b7b5ad547b803bdbe10892134ca8868d8
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Fri Feb 15 15:08:42 2013 +0100
Add copr_created signal
>---------------------------------------------------------------
coprs_frontend/coprs/logic/coprs_logic.py | 2 ++
coprs_frontend/coprs/signals.py | 1 +
.../tests/test_views/test_coprs_ns/test_general.py | 16 ++++++++++++++++
3 files changed, 19 insertions(+), 0 deletions(-)
diff --git a/coprs_frontend/coprs/logic/coprs_logic.py b/coprs_frontend/coprs/logic/coprs_logic.py
index 0a1d373..f124006 100644
--- a/coprs_frontend/coprs/logic/coprs_logic.py
+++ b/coprs_frontend/coprs/logic/coprs_logic.py
@@ -4,6 +4,7 @@ from coprs import db
from coprs import exceptions
from coprs import helpers
from coprs import models
+from coprs import signals
from coprs import whoosheers
class CoprsLogic(object):
@@ -80,6 +81,7 @@ class CoprsLogic(object):
if check_for_duplicates and cls.exists_for_current_user(user, copr.name).all():
raise exceptions.DuplicateException(
'Copr: "{0}" already exists'.format(copr.name))
+ signals.copr_created.send(cls, copr=copr)
db.session.add(copr)
@classmethod
diff --git a/coprs_frontend/coprs/signals.py b/coprs_frontend/coprs/signals.py
index cc9b996..47c990c 100644
--- a/coprs_frontend/coprs/signals.py
+++ b/coprs_frontend/coprs/signals.py
@@ -3,3 +3,4 @@ import blinker
coprs_signals = blinker.Namespace()
build_finished = coprs_signals.signal('build-finished')
+copr_created = coprs_signals.signal('copr-created')
diff --git a/coprs_frontend/tests/test_views/test_coprs_ns/test_general.py b/coprs_frontend/tests/test_views/test_coprs_ns/test_general.py
index f57ecde..572bfef 100644
--- a/coprs_frontend/tests/test_views/test_coprs_ns/test_general.py
+++ b/coprs_frontend/tests/test_views/test_coprs_ns/test_general.py
@@ -1,5 +1,7 @@
import flask
+from coprs.signals import copr_created
+
from tests.coprs_test_case import CoprsTestCase
class TestCoprsShow(CoprsTestCase):
@@ -72,6 +74,20 @@ class TestCoprNew(CoprsTestCase):
# make sure no initial build was submitted
assert self.models.Build.query.first() == None
+ def test_copr_new_emits_signal(self, f_users, f_mock_chroots, f_db):
+ with self.tc as c:
+ with c.session_transaction() as s:
+ s['openid'] = self.u1.openid_name
+ # TODO: this should probably be mocked...
+ signals_received = []
+ def test_receiver(sender, **kwargs):
+ signals_received.append(kwargs['copr'])
+ copr_created.connect(test_receiver)
+ r = c.post('/coprs/new/', data={'name': 'foo', 'fedora-rawhide-i386': 'y', 'arches': ['i386']}, follow_redirects=True)
+ assert len(signals_received) == 1
+ assert signals_received[0].name == 'foo'
+
+
def test_copr_new_exists_for_another_user(self, f_users, f_coprs, f_mock_chroots, f_db):
with self.tc as c:
with c.session_transaction() as s:
11 years, 2 months
[copr] master: Introduce build_finished signal (36a4c15)
by bkabrda@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 36a4c15ebd71fbf25bf288cb44db45475ed976ee
Author: Bohuslav Kabrda <bkabrda(a)redhat.com>
Date: Fri Feb 15 13:56:58 2013 +0100
Introduce build_finished signal
>---------------------------------------------------------------
coprs_frontend/coprs/logic/builds_logic.py | 3 +
coprs_frontend/coprs/signals.py | 5 +
.../test_views/test_backend_ns/test_general.py | 98 +++++++++++---------
3 files changed, 64 insertions(+), 42 deletions(-)
diff --git a/coprs_frontend/coprs/logic/builds_logic.py b/coprs_frontend/coprs/logic/builds_logic.py
index b936a0c..2ee9a07 100644
--- a/coprs_frontend/coprs/logic/builds_logic.py
+++ b/coprs_frontend/coprs/logic/builds_logic.py
@@ -3,6 +3,7 @@ import time
from coprs import db
from coprs import exceptions
from coprs import models
+from coprs import signals
from coprs.logic import coprs_logic
@@ -88,6 +89,8 @@ class BuildsLogic(object):
value = upd_dict.get(attr, None)
if value != None:
setattr(build, attr, value)
+ if attr == 'ended_on':
+ signals.build_finished.send(cls, build=build)
db.session.add(build)
diff --git a/coprs_frontend/coprs/signals.py b/coprs_frontend/coprs/signals.py
new file mode 100644
index 0000000..cc9b996
--- /dev/null
+++ b/coprs_frontend/coprs/signals.py
@@ -0,0 +1,5 @@
+import blinker
+
+coprs_signals = blinker.Namespace()
+
+build_finished = coprs_signals.signal('build-finished')
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 f7328a1..d5433d7 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
@@ -2,6 +2,7 @@ import json
import flask
+from coprs.signals import build_finished
from tests.coprs_test_case import CoprsTestCase
class TestWaitingBuilds(CoprsTestCase):
@@ -13,14 +14,7 @@ class TestWaitingBuilds(CoprsTestCase):
assert len(json.loads(r.data)['builds']) == 2
class TestUpdateBuilds(CoprsTestCase):
- def test_updating_requires_password(self, f_users, f_coprs, f_builds, f_db):
- r = self.tc.post('/backend/update_builds/',
- content_type = 'application/json',
- data = '')
- assert 'You have to provide the correct password' in r.data
-
- def test_update_build_started(self, f_users, f_coprs, f_builds, f_db):
- data = """
+ data1="""
{
"builds":[
{
@@ -30,21 +24,9 @@ class TestUpdateBuilds(CoprsTestCase):
"started_on": 1234
}
]
-}
- """
- r = self.tc.post('/backend/update_builds/',
- content_type='application/json',
- headers = self.auth_header,
- data = data)
- assert json.loads(r.data)["updated_builds_ids"] == [1]
- assert json.loads(r.data)["non_existing_builds_ids"] == []
-
- updated = self.models.Build.query.filter(self.models.Build.id == 1).first()
- assert updated.results == 'http://server/results/foo/bar/'
- assert updated.started_on == 1234
+}"""
- def test_update_build_ended(self, f_users, f_coprs, f_builds, f_db):
- data = """
+ data2 = """
{
"builds":[
{
@@ -54,21 +36,9 @@ class TestUpdateBuilds(CoprsTestCase):
"ended_on": 12345
}
]
-}
- """
- r = self.tc.post('/backend/update_builds/',
- content_type='application/json',
- headers = self.auth_header,
- data = data)
- assert json.loads(r.data)["updated_builds_ids"] == [1]
- assert json.loads(r.data)["non_existing_builds_ids"] == []
+}"""
- updated = self.models.Build.query.filter(self.models.Build.id == 1).first()
- assert updated.status == 1
- assert updated.ended_on == 12345
-
- def test_update_more_existent_and_non_existent_builds(self, f_users, f_coprs, f_builds, f_db):
- data = """
+ data3 = """
{
"builds":[
{
@@ -96,20 +66,64 @@ class TestUpdateBuilds(CoprsTestCase):
"started_on": 1234
}
]
-}
- """
+}"""
+ def test_updating_requires_password(self, f_users, f_coprs, f_builds, f_db):
+ r = self.tc.post('/backend/update_builds/',
+ content_type = 'application/json',
+ data = '')
+ assert 'You have to provide the correct password' in r.data
+
+ def test_update_build_started(self, f_users, f_coprs, f_builds, f_db):
r = self.tc.post('/backend/update_builds/',
content_type='application/json',
- headers = self.auth_header,
- data = data)
+ headers=self.auth_header,
+ data=self.data1)
+ assert json.loads(r.data)["updated_builds_ids"] == [1]
+ assert json.loads(r.data)["non_existing_builds_ids"] == []
+
+ updated = self.models.Build.query.filter(self.models.Build.id==1).first()
+ assert updated.results == 'http://server/results/foo/bar/'
+ assert updated.started_on == 1234
+
+ def test_update_build_ended(self, f_users, f_coprs, f_builds, f_db):
+ r = self.tc.post('/backend/update_builds/',
+ content_type='application/json',
+ headers=self.auth_header,
+ data=self.data2)
+ assert json.loads(r.data)["updated_builds_ids"] == [1]
+ assert json.loads(r.data)["non_existing_builds_ids"] == []
+
+ updated = self.models.Build.query.filter(self.models.Build.id==1).first()
+ assert updated.status == 1
+ assert updated.ended_on == 12345
+
+ def test_update_more_existent_and_non_existent_builds(self, f_users, f_coprs, f_builds, f_db):
+ r = self.tc.post('/backend/update_builds/',
+ content_type='application/json',
+ headers=self.auth_header,
+ data=self.data3)
assert sorted(json.loads(r.data)["updated_builds_ids"]) == [1, 2]
assert sorted(json.loads(r.data)["non_existing_builds_ids"]) == [123321, 1234321]
- started = self.models.Build.query.filter(self.models.Build.id == 1).first()
+ started = self.models.Build.query.filter(self.models.Build.id==1).first()
assert started.results == 'http://server/results/foo/bar/'
assert started.started_on == 1234
- ended = self.models.Build.query.filter(self.models.Build.id == 2).first()
+ ended = self.models.Build.query.filter(self.models.Build.id==2).first()
assert ended.status == 0
assert ended.ended_on == 123456
+
+ def test_build_ended_emmits_signal(self, f_users, f_coprs, f_builds, f_db):
+ # TODO: this should probably be mocked...
+ signals_received = []
+ def test_receiver(sender, **kwargs):
+ signals_received.append(kwargs['build'])
+ build_finished.connect(test_receiver)
+ r = self.tc.post('/backend/update_builds/',
+ content_type='application/json',
+ headers=self.auth_header,
+ data=self.data3)
+ assert len(signals_received) == 1
+ self.db.session.add(self.b2)
+ assert signals_received[0].id == 2
11 years, 2 months