<commit_before># Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import collections

import requests

from pyramid.config import Configurator
from pyramid.httpexceptions import HTTPMovedPermanently, HTTPNotFound
from pyramid.view import view_config

from .mapper import PyPIDebianMapper


@view_config(route_name="project.index", renderer="project.html")
def project_index(request, project):
    # Fetch the data from PyPI
    resp = requests.get("https://pypi.python.org/pypi/{}/json".format(project))
    resp.raise_for_status()
    data = resp.json()

    # Sort the data from PyPI
    releases = collections.OrderedDict()
    for version, files in sorted(data["releases"].items()):
        releases[version] = sorted(files, key=lambda x: x["filename"])

    return {"project": data["info"], "releases": releases}


@view_config(route_name="project.file")
def project_file(request, project, filename):
    # Get the data from PyPI
    resp = requests.get("https://pypi.python.org/pypi/{}/json".format(project))
    resp.raise_for_status()<commit_msg>Handle 404 errors from PyPI<commit_after># Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import collections

import requests

from pyramid.config import Configurator
from pyramid.httpexceptions import HTTPMovedPermanently, HTTPNotFound
from pyramid.view import view_config

from .mapper import PyPIDebianMapper


@view_config(route_name="project.index", renderer="project.html")
def project_index(request, project):
    # Fetch the data from PyPI
    try:
        resp = requests.get(
            "https://pypi.python.org/pypi/{}/json".format(project)
        )
        resp.raise_for_status()
    except requests.HTTPError as exc:
        if exc.response.status_code == 404:
            raise HTTPNotFound("Could not find project '{}'".format(project))
        raise
    data = resp.json()

    # Sort the data from PyPI
    releases = collections.OrderedDict()
    for version, files in sorted(data["releases"].items()):
        releases[version] = sorted(files, key=lambda x: x["filename"])

    return {"project": data["info"], "releases": releases}


@view_config(route_name="project.file")
def project_file(request, project, filename):
    # Get the data from PyPI
    try:
        resp = requests.get(
            "https://pypi.python.org/pypi/{}/json".format(project)
        )
        resp.raise_for_status()
    except requests.HTTPError as exc:
        if exc.response.status_code == 404:
            raise HTTPNotFound("Could not find project '{}'".format(project))
{'fraction_non_alphanumeric': 0.10301650540694365, 'fraction_numerical': 0.004837791690381332, 'mean_word_length': 3.9507042253521125, 'pattern_counts': {'":': 4, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 4, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2442469', 'n_tokens_mistral': 1004, 'n_tokens_neox': 958, 'n_words': 334}