def test_db_config(self): """Assert creating the application configures the scoped session.""" # Assert the scoped session is not bound. self.assertRaises(UnboundExecutionError, Session.get_bind) Session.remove() app.create({'DB_URL': 'sqlite://'}) self.assertEqual('sqlite://', str(Session().get_bind().url))
def edit_project_mapping(project_id, pkg_id): project = anitya.lib.model.Project.get(SESSION, project_id) if not project: flask.abort(404) package = anitya.lib.model.Packages.by_id(SESSION, pkg_id) if not package: flask.abort(404) form = anitya.forms.MappingForm(obj=package) if form.validate_on_submit(): try: utilities.map_project( SESSION, project=project, package_name=form.package_name.data, distribution=form.distro.data, user_id=flask.g.auth.openid, old_package_name=package.package_name, old_distro_name=package.distro, ) SESSION.commit() flask.flash('Mapping edited') except anitya.lib.exceptions.AnityaInvalidMappingException as err: err.link = flask.url_for('anitya_ui.project', project_id=err.project_id) flask.flash(err.message, 'error') except anitya.lib.exceptions.AnityaException as err: flask.flash(str(err), 'error') return flask.redirect( flask.url_for('anitya_ui.project', project_id=project_id)) return flask.render_template( 'mapping.html', current='projects', project=project, package=package, form=form, )
def map_project(project_id): project = anitya.lib.model.Project.get(SESSION, project_id) if not project: flask.abort(404) form = anitya.forms.MappingForm() if flask.request.method == 'GET': form.package_name.data = flask.request.args.get( 'package_name', project.name) form.distro.data = flask.request.args.get('distro', '') if form.validate_on_submit(): try: utilities.map_project( SESSION, project=project, package_name=form.package_name.data.strip(), distribution=form.distro.data.strip(), user_id=flask.g.auth.openid, ) SESSION.commit() flask.flash('Mapping added') except anitya.lib.exceptions.AnityaInvalidMappingException as err: err.link = flask.url_for('anitya_ui.project', project_id=err.project_id) flask.flash(err.message, 'error') except anitya.lib.exceptions.AnityaException as err: flask.flash(str(err), 'error') return flask.redirect( flask.url_for('anitya_ui.project', project_id=project.id)) return flask.render_template( 'mapping.html', current='projects', project=project, form=form, )
def shutdown_session(exception=None): ''' Remove the DB session at the end of each request. ''' SESSION.remove()
def post(self): """ Create a new project. **Example Request**: .. sourcecode:: http POST /api/v2/projects/?access_token=MYAPIACCESSTOKEN HTTP/1.1 Accept: application/json Accept-Encoding: gzip, deflate Connection: keep-alive Content-Length: 114 Content-Type: application/json Host: localhost:5000 User-Agent: HTTPie/0.9.4 { "backend": "custom", "homepage": "http://example.com/test", "name": "test_project", "version_prefix": "release-" } **Example Response**: .. sourcecode:: http HTTP/1.0 201 CREATED Content-Length: 276 Content-Type: application/json Date: Sun, 26 Mar 2017 15:56:30 GMT Server: Werkzeug/0.12.1 Python/2.7.13 { "backend": "PyPI", "created_on": 1490543790.0, "homepage": "http://python-requests.org", "id": 13857, "name": "requests", "regex": null, "updated_on": 1490543790.0, "version": null, "version_url": null, "versions": [] } :query string access_token: Your API access token. :reqjson string name: The project name :reqjson string homepage: The project homepage URL :reqjson string backend: The project backend (github, folder, etc.). :reqjson string version_url: The URL to fetch when determining the project version (defaults to null). :reqjson string version_prefix: The project version prefix, if any. For example, some projects prefix with "v". :reqjson string regex: The regex to use when searching the ``version_url`` page. :reqjson bool insecure: When retrieving the versions via HTTPS, do not validate the certificate (defaults to false). :reqjson bool check_release: Check the release immediately after creating the project. :statuscode 201: When the project was successfully created. :statuscode 400: When required arguments are missing or malformed. :statuscode 401: When your access token is missing or invalid, or when the server is not configured for OpenID Connect. The response will include a JSON body describing the exact problem. :statuscode 409: When the project already exists. """ name_help = _('The project name') homepage_help = _('The project homepage URL') backend_help = _('The project backend (github, folder, etc.)') version_url_help = _('The URL to fetch when determining the project ' 'version (defaults to null)') version_prefix_help = _('The project version prefix, if any. For ' 'example, some projects prefix with "v"') regex_help = _('The regex to use when searching the version_url page') insecure_help = _('When retrieving the versions via HTTPS, do not ' 'validate the certificate (defaults to false)') check_release_help = _('Check the release immediately after creating ' 'the project.') parser = _BASE_ARG_PARSER.copy() parser.add_argument('name', type=str, help=name_help, required=True) parser.add_argument('homepage', type=str, help=homepage_help, required=True) parser.add_argument('backend', type=str, help=backend_help, required=True) parser.add_argument('version_url', type=str, help=version_url_help, default=None) parser.add_argument('version_prefix', type=str, help=version_prefix_help, default=None) parser.add_argument('regex', type=str, help=regex_help, default=None) parser.add_argument('insecure', type=bool, help=insecure_help, default=False) parser.add_argument('check_release', type=bool, help=check_release_help) args = parser.parse_args(strict=True) access_token = args.pop('access_token') try: project = utilities.create_project( SESSION, user_id=authentication.oidc.user_getfield( 'email', access_token), **args) SESSION.commit() return project.__json__(), 201 except ProjectExists as e: response = jsonify(e.to_dict()) response.status_code = 409 return response
def new_project(): """ View for creating a new project. This function accepts GET and POST requests. POST requests can result in a HTTP 400 for invalid forms, a HTTP 409 if the request conflicts with an existing project, or a HTTP 302 redirect to the new project. """ plugins = anitya.lib.plugins.load_plugins(SESSION) plg_names = [plugin.name for plugin in plugins] form = anitya.forms.ProjectForm(backends=plg_names) if flask.request.method == 'GET': form.name.data = flask.request.args.get('name', '') form.homepage.data = flask.request.args.get('homepage', '') form.backend.data = flask.request.args.get('backend', '') form.distro.data = flask.request.args.get('distro', '') form.package_name.data = flask.request.args.get('package_name', '') return flask.render_template( 'project_new.html', context='Add', current='Add projects', form=form, plugins=plugins, ) elif form.validate_on_submit(): project = None try: project = utilities.create_project( SESSION, name=form.name.data.strip(), homepage=form.homepage.data.strip(), backend=form.backend.data.strip(), version_url=form.version_url.data.strip() or None, version_prefix=form.version_prefix.data.strip() or None, regex=form.regex.data.strip() or None, user_id=flask.g.auth.openid, check_release=form.check_release.data, ) SESSION.commit() # Optionally, the user can also map a distro when creating a proj. if form.distro.data and form.package_name.data: utilities.map_project( SESSION, project=project, package_name=form.package_name.data, distribution=form.distro.data, user_id=flask.g.auth.openid, ) SESSION.commit() flask.flash('Project created') except anitya.lib.exceptions.AnityaException as err: flask.flash(str(err)) return flask.render_template('project_new.html', context='Add', current='Add projects', form=form, plugins=plugins), 409 if project: return flask.redirect( flask.url_for('anitya_ui.project', project_id=project.id)) return flask.render_template('project_new.html', context='Add', current='Add projects', form=form, plugins=plugins), 400
def setUp(self): # Make sure each test starts with a clean session Session.remove() Session.configure(bind=None)