Skip to content

tituszban/showcode_forge

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Showcode Forge

Tools for generating code for ShowCode Forge. ShowCode Forge is a community dedicated to creating challenges on ShowCode.

Install

This tool requires Python 3.7+. You can download Python from here

Install the latest release of the package from PyPi.

pip install showcode_forge

Validate

Validating is ensuring that your challenge .json file is correct according to the "Tome of Crafting" (aka the how to guide). It verifies that you have all fields correctly filled out, that your unit tests match your parameters and return types and that your points add up.

How to run:

showcode_forge validate [--verbose] file
  • file is a path ot the .json file
  • --verbose enables additional logging. Without this, if there are no errors, the tool will not output anything

Example usage:

showcode_forge validate --verbose challenge.json

Extract

Extracting is turning a challenge .json (provided by the community) into a set of files, including question.html and generated source and test files for your selected language.

How to run:

showcode_forge extract [--language LANGUAGE] [--framework FRAMEWORK] file
  • file is a path to the .json file
  • LANGUAGE is the selected programming language. Currently supported: py
  • FRAMEWORK is the selected unit testing framework. Currently supported: unittest, pytest, pytest_scforge (see bellow), default: unittest

Example usage:

showcode_forge extract --language py --framework unittest challenge.json

Compile

Compiling is turning a source, test and question files into a .json file.

How to run:

showcode_forge compile [--output OUTPUT] [--language LANGUAGE] [--framework FRAMEWORK] source_file test_file question_file
  • source_file is a path to the solution file where the correct answer is defined
  • test_file is a path to the file that defines unit tests
  • question_file is a path to the file that defines the question rubric text (usually .html)
  • OUTPUT is a path to where the output will be generated (default: challenge.json)
  • LANGUAGE is the programming language source_file and test_file are written in. Currently supported: py
  • FRAMEWORK is the unit testing framework used to define the test cases. Currently supported: pytest_scforge (see bellow)

Example usage:

showcode_forge compile --language py --framework pytest_scforge --output my_awesome_challenge.json solution.py tests.py question.html

Using Pytest with ShowCode Forge

The current only supported compiler is a modified version of pytest. Here is how you would normally write a challenge using pytest:

import pytest
from solution import Solution

@pytest.mark.parametrize(
    "count,expected_result",
    [
        (3, "1, 2, Fizz"),
        (7, "1, 2, Fizz, 4, Buzz, Fizz, 7"),
        (0, "")
    ]
)
def test_fizzbuzz(count, expected_result):
    s = Solution()
    assert s.fizzbuzz(count) == expected_result

You would run this, by running pytest in the command line.

With ShowCode Forge here is what the same test looks like:

from showcode_forge import challenge, TestCase
from solution import Solution

@challenge(
    "count,expected_result",
    [
        TestCase([3], "1, 2, Fizz", "Simple public case", is_public=True),
        TestCase([7], "1, 2, Fizz, 4, Buzz, Fizz, 7", "More complex private case", points=2),
        TestCase([0], "", "Empty case", points=3)
    ]
)
def test_fizzbuzz(count, expected_result):
    s = Solution()
    assert s.fizzbuzz(count) == expected_result

This runs exactly the same if you run pytest in the command line. @challenge generates pytest test cases behind the scenes.

It uses the parameter declaration and the various test cases to infer parameter names and types. It automatically calculates the point total as well. If points is not specified, it defaults to 1. If is_public is not specified it defaults to False.

It does not support every field currently. You will have to manually edit the .json to set the title, className and methodName. difficulty is infered from total points, but can be updated.

Scaffold

Scaffolding sets up the files needed to develop a challenge with the some starting boilerplate code in place.

How to run:

showcode_forge scaffold [-h] [--argument ARGUMENT [ARGUMENT ...]] [--result RESULT] [--output_dir OUTPUT_DIR] [--language LANGUAGE] [--framework FRAMEWORK] [--question_file_type {html,md}] class_name method_name
  • class_name is the name of the tested class
  • method_name is the name of the tested method in the tested class
  • ARGUMENT is a list of argument names that the tested method takes
  • RESULT is the name of the result produced by the tested method
  • OUTPUT_DIR is the directory where the output is generated. If not specified, it will be generated in the current directory
  • LANGUAGE is the programming language the files will be generated in. Currently supported: py
  • FRAMEWORK is the unit testing framework used to define the test cases. Currently supported: pytest_scforge (see above)
  • QUESTION_FILE_TYPE is the type of markup used for the question file. Currently supported: html, md (Markdown)

Example usage:

python -m showcode_forge scaffold "ClassName" "solve_challenge" --argument "arg_1" "arg_2" "arg_3" --language py --framework pytest_scforge

Contribute

Contributions, bug fixes and support for more languages are welcome!

How to contribute

Running locally

Run this package locally to test it, in the root of the project:

python -m showcode_forge [arguments]