Exemplo n.º 1
0
def test_new_unsupported_language(db):
    # Explicit mode
    with pytest.raises(ProgrammingLanguage.DoesNotExist):
        get_programming_language('foolang')

    # Silent mode
    lang = get_programming_language('foolang', raises=False)
    assert lang.ref == 'foolang'
    assert lang.name == 'Foolang'
    assert lang.is_supported is False
    assert lang.is_language is True
    assert lang.is_binary is False
Exemplo n.º 2
0
def expand_tests_from_program(question, tests: IoSpec, language=None):
    """
    Uses source code from source code reference in the provided language
    to expand tests.
    """

    language = get_programming_language(language)
    answer_key = question.answers.get(language=language)

    if not answer_key.source:
        raise ValueError('cannot expand from %s: no program set' % language)

    source = answer_key.source
    language_ref = language.ejudge_ref()

    if tests.is_simple:
        return tests.copy()

    if tests.is_standard_test_case:
        tests = tests.copy()
        tests.expand_inputs()

        if tests.is_simple:
            return tests

    return question.run_code(source, tests, language)
Exemplo n.º 3
0
    def serve_ajax_submission(self,
                              client,
                              source=None,
                              language=None,
                              **kwargs):
        """
        Handles student responses via AJAX and a srvice program.
        """

        # User must choose language
        if not language or language == '-----':
            if self.language is None:
                fmt = _('Error'), _('Please select the correct language')
                client.dialog(
                    '<p class="dialog-text"><h2>%s</h2><p>%s</p></p>' % fmt)
                return None
            language = self.language
        else:
            language = get_programming_language(language)

        return super().serve_ajax_submission(
            client=client,
            language=language,
            source=source,
        )
Exemplo n.º 4
0
def expand_tests_from_program(question, tests: IoSpec, language=None):
    """
    Uses source code from source code reference in the provided language
    to expand tests.
    """

    language = get_programming_language(language)
    answer_key = question.answers.get(language=language)

    if not answer_key.source:
        raise ValueError('cannot expand from %s: no program set' % language)

    source = answer_key.source
    language_ref = language.ejudge_ref()

    if tests.is_simple:
        return tests.copy()

    if tests.is_standard_test_case:
        tests = tests.copy()
        tests.expand_inputs()

        if tests.is_simple:
            return tests

    return question.run_code(source, tests, language)
Exemplo n.º 5
0
    def expand_from_code(self, source, inputs, language=None, timeout=None):
        """
        Wrapped version of expand_from_code() that uses question's own timeout
        and language as default.
        """

        language = get_programming_language(language or self.language)
        timeout = timeout or self.timeout
        return ejudge.expand_from_code(source, inputs, language, timeout)
Exemplo n.º 6
0
 def submit(self, user_or_request, language=None, **kwargs):
     if language and self.language:
         if language != self.language:
             args = language, self.language
             raise ValueError('cannot set language: %r != %r' % args)
     if self.language:
         language = self.language
     language = get_programming_language(language)
     return super().submit(user_or_request, language=language, **kwargs)
Exemplo n.º 7
0
 def submit(self, user_or_request, language=None, **kwargs):
     if language and self.language:
         if language != self.language:
             args = language, self.language
             raise ValueError('cannot set language: %r != %r' % args)
     if self.language:
         language = self.language
     language = get_programming_language(language)
     return super().submit(user_or_request, language=language, **kwargs)
Exemplo n.º 8
0
    def expand_from_code(self, source, inputs, language=None, timeout=None):
        """
        Wrapped version of expand_from_code() that uses question's own timeout
        and language as default.
        """

        language = get_programming_language(language or self.language)
        timeout = timeout or self.timeout
        return ejudge.expand_from_code(source, inputs, language, timeout)
Exemplo n.º 9
0
    def check_with_code(self, source, tests, language=None, timeout=None):
        """
        Wrapped version of check_with_code() that uses question's own timeout
        and language as default.
        """

        language = get_programming_language(language or self.language)
        timeout = timeout or self.timeout
        ejudge.check_with_code(source, tests, language, timeout)
Exemplo n.º 10
0
    def check_with_code(self, source, tests, language=None, timeout=None):
        """
        Wrapped version of check_with_code() that uses question's own timeout
        and language as default.
        """

        language = get_programming_language(language or self.language)
        timeout = timeout or self.timeout
        ejudge.check_with_code(source, tests, language, timeout)
Exemplo n.º 11
0
def update_markio_data(question, data):
    """
    Update question parameters from Markio file.
    """

    md = data if hasattr(data, 'title') else parse_markio(data)

    # Load simple data from markio
    question.title = md.title or question.title
    question.short_description = (md.short_description or
                                  question.short_description)
    question.timeout = md.timeout or question.timeout
    question.author_name = md.author or question.author_name
    question.pre_tests_source = md.tests_source or question.pre_tests_source
    question.post_tests_source = md.hidden_tests_source
    if md.language is not None:
        question.language = get_programming_language(md.language)
    if md.points is not None:
        question.points_total = md.points
    if md.stars is not None:
        question.starts_total = md.stars

    # Load main description
    question.body = markdown_to_blocks(md.description)

    # Add answer keys
    answer_keys = OrderedDict()
    for (lang, answer_key) in md.answer_key.items():
        language = get_programming_language(lang)
        key = question.answers.create(question=question,
                                      language=language,
                                      source=answer_key)
        answer_keys[lang] = key
    for (lang, placeholder) in md.placeholder.items():
        if placeholder is None:
            question.default_placeholder = placeholder
        try:
            answer_keys[lang].placeholder = placeholder
        except KeyError:
            language = get_programming_language(lang)
            question.answers.create(language=language,
                                    placeholder=placeholder)
    question.__answers = list(answer_keys.values())
    question.answers = question.__answers
Exemplo n.º 12
0
def update_markio_data(question, data):
    """
    Update question parameters from Markio file.
    """

    md = data if hasattr(data, 'title') else parse_markio(data)

    # Load simple data from markio
    question.title = md.title or question.title
    question.short_description = (md.short_description
                                  or question.short_description)
    question.timeout = md.timeout or question.timeout
    question.author_name = md.author or question.author_name
    question.pre_tests_source = md.tests_source or question.pre_tests_source
    question.post_tests_source = md.hidden_tests_source
    if md.language is not None:
        question.language = get_programming_language(md.language)
    if md.points is not None:
        question.points_total = md.points
    if md.stars is not None:
        question.starts_total = md.stars

    # Load main description
    question.body = markdown_to_blocks(md.description)

    # Add answer keys
    answer_keys = OrderedDict()
    for (lang, answer_key) in md.answer_key.items():
        language = get_programming_language(lang)
        key = question.answers.create(question=question,
                                      language=language,
                                      source=answer_key)
        answer_keys[lang] = key
    for (lang, placeholder) in md.placeholder.items():
        if placeholder is None:
            question.default_placeholder = placeholder
        try:
            answer_keys[lang].placeholder = placeholder
        except KeyError:
            language = get_programming_language(lang)
            question.answers.create(language=language, placeholder=placeholder)
    question.__answers = list(answer_keys.values())
    question.answers = question.__answers
Exemplo n.º 13
0
    def get_reference_source(self, language=None):
        """
        Return the reference source code for the given language or None, if no
        reference is found.
        """

        if language is None:
            language = self.language
        qs = self.answers.all().filter(
            language=get_programming_language(language))
        if qs:
            return qs.get().source
        return ''
Exemplo n.º 14
0
    def get_reference_source(self, language=None):
        """
        Return the reference source code for the given language or None, if no
        reference is found.
        """

        if language is None:
            language = self.language
        qs = self.answers.all().filter(
            language=get_programming_language(language))
        if qs:
            return qs.get().source
        return ''
Exemplo n.º 15
0
    def serve_ajax_submission(self, client, source=None, language=None,
                              **kwargs):
        """
        Handles student responses via AJAX and a srvice program.
        """

        # User must choose language
        if not language or language == '-----':
            if self.language is None:
                fmt = _('Error'), _('Please select the correct language')
                client.dialog(
                    '<p class="dialog-text"><h2>%s</h2><p>%s</p></p>' % fmt
                )
                return None
            language = self.language
        else:
            language = get_programming_language(language)

        return super().serve_ajax_submission(
            client=client,
            language=language,
            source=source,
        )
Exemplo n.º 16
0
def test_validate_multiple_answer_keys(db):
    question = example('simple')
    question.answers.create(language=get_programming_language('c'),
                            source=source('hello.c'))
    question.full_clean_all()
Exemplo n.º 17
0
def test_get_language_support_most_common_languages(db):
    assert get_programming_language('python').name == 'Python 3.5'
    assert get_programming_language('python2').name == 'Python 2.7'
Exemplo n.º 18
0
def test_validate_multiple_answer_keys(db):
    question = example('simple')
    question.answers.create(language=get_programming_language('c'),
                            source=source('hello.c'))
    question.full_clean_all()