Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
f62c91f
updating requirements
dariadiatlova Apr 13, 2021
daee49b
adding script to run tool on xlsx file
dariadiatlova Apr 13, 2021
52d971c
adding testing files
dariadiatlova Apr 13, 2021
45b5919
adding tests
dariadiatlova Apr 13, 2021
e797191
Requirements for xlsx tool
dariadiatlova Apr 14, 2021
2172286
XLSX run_tool
dariadiatlova Apr 14, 2021
52b28ae
Files to test xlsx run tool
dariadiatlova Apr 14, 2021
6a50db5
XLSX run tool tests
dariadiatlova Apr 14, 2021
5c1c7cf
Update build.yml
dariadiatlova Apr 14, 2021
db4eca8
Update build.yml
dariadiatlova Apr 14, 2021
8f2f19f
Update build.yml
dariadiatlova Apr 14, 2021
6ac1154
Clean xlsx
dariadiatlova Apr 14, 2021
2b3fd79
Merge branch 'xlsx_run_tool' of https://github.com/hyperskill/hyperst…
dariadiatlova Apr 14, 2021
f0cce19
Tempfiles substituted with regular
dariadiatlova Apr 14, 2021
5db8e3d
File name substituted with absolute path
dariadiatlova Apr 14, 2021
b708c1d
Adding new func names
dariadiatlova Apr 15, 2021
c5c75d9
Update evaluation tests
dariadiatlova Apr 15, 2021
f901771
Files for evaluation testing
dariadiatlova Apr 15, 2021
30ba7b2
Update functionality xlsx-run tool
dariadiatlova Apr 15, 2021
61a054f
Adding MAIN_FOLDER
dariadiatlova Apr 15, 2021
62bce7d
Evaluation tool-interface update
dariadiatlova Apr 15, 2021
90edf16
Updating evaluation tests
dariadiatlova Apr 15, 2021
c0eeed2
Change mode for opening file
dariadiatlova Apr 16, 2021
7439faa
Adding file exist exception
dariadiatlova Apr 16, 2021
4641276
Assertation update
dariadiatlova Apr 16, 2021
685d0bb
Adding gitkeep
dariadiatlova Apr 16, 2021
296efac
Adiing gitkeep
dariadiatlova Apr 16, 2021
6acc246
Fixed typing issue
dariadiatlova Apr 17, 2021
fe4877f
Resolving conflicts
dariadiatlova Apr 17, 2021
efd5dcb
Merge branch 'develop' into xlsx_run_tool
GirZ0n Apr 18, 2021
8082f78
Fixed imports
GirZ0n Apr 18, 2021
ab62d8a
Fixed imports
GirZ0n Apr 18, 2021
b8d6156
Updated evaluation module
dariadiatlova Apr 21, 2021
fa2c376
Added common class with run_tool arguments
dariadiatlova Apr 21, 2021
85973c0
Updated run_tool argnames and several functions
dariadiatlova Apr 21, 2021
11772d6
Updated evaluation tests
dariadiatlova Apr 21, 2021
9ceeb73
Updated evaluation resources
dariadiatlova Apr 21, 2021
dc12b8b
Resolving conflicts
dariadiatlova Apr 21, 2021
9653133
Fixed merging issue
dariadiatlova Apr 21, 2021
1a52079
Fixed merging issue
dariadiatlova Apr 21, 2021
4c8a54d
Fixed Flake inspection
dariadiatlova Apr 21, 2021
b7187fd
Fixed Flake inspection issue
dariadiatlova Apr 21, 2021
6ec4240
Added util
dariadiatlova Apr 21, 2021
21f4cfd
Added logger to check test output
dariadiatlova Apr 21, 2021
5303706
Added logger to check test output
dariadiatlova Apr 21, 2021
39d3a38
Save artifacts for debugging
dariadiatlova Apr 22, 2021
137f800
Updated tests to save artefacts
dariadiatlova Apr 22, 2021
1686785
Dedugging loggits
dariadiatlova Apr 22, 2021
ec560a8
Updated resources
dariadiatlova Apr 22, 2021
e6111e1
Remove saved files after debugging
dariadiatlova Apr 22, 2021
31f1235
Added evaluation README.me
dariadiatlova Apr 22, 2021
76ecafe
Updated readme and fixed argname
dariadiatlova Apr 22, 2021
53f45f1
Resolved pull request issues
dariadiatlova Apr 26, 2021
f07a717
Resolved pull request issues
dariadiatlova Apr 26, 2021
7b1a14a
Resolved pull request issues
dariadiatlova Apr 26, 2021
ede99f8
Resolved pull request issues
dariadiatlova Apr 26, 2021
a7fd99f
Updated flags in README.md
dariadiatlova Apr 26, 2021
5dd2adc
Update README.md
dariadiatlova Apr 26, 2021
04123e0
Update README.md
dariadiatlova Apr 26, 2021
9e3873f
Update README.md
dariadiatlova Apr 26, 2021
4ca4610
Update README.md
dariadiatlova Apr 27, 2021
bed4b53
Update README.md
dariadiatlova Apr 28, 2021
d6bbc11
Added a separate requirements file for evaluation module
dariadiatlova Apr 28, 2021
7535452
Resolved PR issues
dariadiatlova Apr 28, 2021
b025607
Merge branch 'xlsx_run_tool' of https://github.com/hyperskill/hyperst…
dariadiatlova Apr 28, 2021
1c96bee
Small fixes after pr
dariadiatlova May 1, 2021
ca36a3d
Small fixes after pr
dariadiatlova May 1, 2021
b272821
Update src/python/evaluation/common/util.py
dariadiatlova May 3, 2021
de2b0ce
Update src/python/evaluation/common/xlsx_util.py
dariadiatlova May 3, 2021
b712c52
added unique to whitelist
dariadiatlova May 3, 2021
fb04b4a
Added unique import
dariadiatlova May 3, 2021
fb7dfba
Update src/python/evaluation/common/util.py
dariadiatlova May 3, 2021
82f46d7
Update src/python/evaluation/xlsx_run_tool.py
dariadiatlova May 3, 2021
62b510b
removed NoReturn import
dariadiatlova May 3, 2021
2c8a3c8
Update src/python/evaluation/evaluation_config.py
dariadiatlova May 3, 2021
a329e77
Fixed Namespace issue
dariadiatlova May 3, 2021
04bc2d7
Update src/python/common/tool_arguments.py
dariadiatlova May 3, 2021
9b46709
Fixed error raising
dariadiatlova May 3, 2021
12244f8
Fixed typing
dariadiatlova May 3, 2021
e4cc0c3
Fixed typing
dariadiatlova May 3, 2021
275128f
Fixed Typing
dariadiatlova May 3, 2021
6f61f6b
Fixed Typing
dariadiatlova May 3, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ jobs:
pip install flake8 pytest
pip install -r requirements.txt
pip install -r requirements-test.txt
pip install -r requirements-evaluation.txt
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
Expand All @@ -38,6 +39,14 @@ jobs:
java-version: '11'
- name: Check java version
run: java -version

- name: Test with pytest
run: |
pytest
- name: Upload pytest test results
uses: actions/upload-artifact@v2
with:
name: pytest-results-${{ matrix.python-version }}
path: test
# Use always() to always run this step to publish test results when there are test failures
if: ${{ always() }}
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ Simply clone the repository and run the following commands:

1. `pip install -r requirements.txt`
2. `pip install -r requirements-test.txt` for tests
3. `pip install -r requirements-evaluation.txt` for evaluation

## Usage

Expand Down
2 changes: 2 additions & 0 deletions requirements-evaluation.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
openpyxl==3.0.7
pandas==1.2.3
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,4 @@ radon==4.5.0
# extra libraries and frameworks
django==3.2
requests==2.25.1
argparse==1.4.0
Empty file added src/python/common/__init__.py
Empty file.
74 changes: 74 additions & 0 deletions src/python/common/tool_arguments.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
from dataclasses import dataclass
from enum import Enum, unique
from typing import List, Optional

from src.python.review.application_config import LanguageVersion
from src.python.review.inspectors.inspector_type import InspectorType


@unique
class VerbosityLevel(Enum):
"""
Same meaning as the logging level. Should be used in command-line args.
"""
DEBUG = '3'
INFO = '2'
ERROR = '1'
DISABLE = '0'

@classmethod
def values(cls) -> List[str]:
return [member.value for member in VerbosityLevel.__members__.values()]


@dataclass(frozen=True)
class ArgumentsInfo:
short_name: Optional[str]
long_name: str
description: str


@unique
class RunToolArgument(Enum):
VERBOSITY = ArgumentsInfo('-v', '--verbosity',
'Choose logging level: '
f'{VerbosityLevel.ERROR.value} - ERROR; '
f'{VerbosityLevel.INFO.value} - INFO; '
f'{VerbosityLevel.DEBUG.value} - DEBUG; '
f'{VerbosityLevel.DISABLE.value} - disable logging; '
'default is 0')

inspectors = [inspector.lower() for inspector in InspectorType.available_values()]
disabled_inspectors_example = f'-d {inspectors[0].lower()},{inspectors[1].lower()}'

DISABLE = ArgumentsInfo('-d', '--disable',
'Disable inspectors. '
f'Available values: {", ".join(inspectors)}. '
f'Example: {disabled_inspectors_example}')

DUPLICATES = ArgumentsInfo(None, '--allow-duplicates',
'Allow duplicate issues found by different linters. '
'By default, duplicates are skipped.')

LANG_VERSION = ArgumentsInfo(None, '--language-version',
'Specify the language version for JAVA inspectors.'
'Available values are: '
f'{LanguageVersion.PYTHON_3.value}, {LanguageVersion.JAVA_8.value}, '
f'{LanguageVersion.JAVA_11.value}, {LanguageVersion.KOTLIN.value}.')

CPU = ArgumentsInfo(None, '--n-cpu',
'Specify number of cpu that can be used to run inspectors')

PATH = ArgumentsInfo(None, 'path', 'Path to file or directory to inspect.')

FORMAT = ArgumentsInfo('-f', '--format',
'The output format. Default is JSON.')

START_LINE = ArgumentsInfo('-s', '--start-line',
'The first line to be analyzed. It starts from 1.')

END_LINE = ArgumentsInfo('-e', '--end-line', 'The end line to be analyzed or None.')

NEW_FORMAT = ArgumentsInfo(None, '--new-format',
'The argument determines whether the tool '
'should use the new format')
31 changes: 31 additions & 0 deletions src/python/evaluation/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Hyperstyle evaluation

This tool allows running the `Hyperstyle` tool on an xlsx table to get code quality for all code fragments. Please, note that your input file should consist of at least 2 obligatory columns to run xlsx-tool on its code fragments:

- `code`
- `lang`

Possible values for column `lang` are: `python3`, `kotlin`, `java8`, `java11`.

Output file is a new `xlsx` file with 3 columns:
- `code`
- `lang`
- `grade`
Grade assessment is conducted by [`run_tool.py`](https://github.com/hyperskill/hyperstyle/blob/main/README.md) with default arguments. Avaliable values for column `grade` are: BAD, MODERATE, GOOD, EXCELLENT. It is also possible add fourth column: `traceback` to get full inspectors feedback on each code fragment. More details on enabling traceback column in **Optional Arguments** table.

## Usage

Run the [xlsx_run_tool.py](xlsx_run_tool.py) with the arguments from command line.

Required arguments:

`xlsx_file_path` — path to xlsx-file with code samples to inspect.

Optional arguments:
Argument | Description
--- | ---
|**‑f**, **‑‑format**| The output format. Available values: `json`, `text`. The default value is `json` . Use this argument when `traceback` is enabled, otherwise it will not be used.|
|**‑tp**, **‑‑tool_path**| Path to run-tool. Default is `src/python/review/run_tool.py` .|
|**‑tr**, **‑‑traceback**| To include a column with errors traceback into an output file. Default is `False`.|
|**‑ofp**, **‑‑output_folder_path**| An explicit folder path to store file with results. Default is a parent directory of a folder with xlsx-file sent for inspection. |
|**‑ofn**, **‑‑output_file_name**| A name of an output file where evaluation results will be stored. Default is `results.xlsx`.|
Empty file.
Empty file.
34 changes: 34 additions & 0 deletions src/python/evaluation/common/util.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from enum import Enum, unique

from src.python.review.application_config import LanguageVersion
from src.python.review.common.file_system import Extension


@unique
class ColumnName(Enum):
CODE = "code"
LANG = "lang"
LANGUAGE = "language"
GRADE = "grade"


@unique
class EvaluationArgument(Enum):
TRACEBACK = "traceback"
RESULT_FILE_NAME = "results"
RESULT_FILE_NAME_EXT = f"{RESULT_FILE_NAME}{Extension.XLSX.value}"


script_structure_rule = ("Please, make sure your XLSX-file matches following script standards: \n"
"1. Your XLSX-file should have 2 obligatory columns named:"
f"'{ColumnName.CODE.value}' & '{ColumnName.LANG.value}'. \n"
f"'{ColumnName.CODE.value}' column -- relates to the code-sample. \n"
f"'{ColumnName.LANG.value}' column -- relates to the language of a "
"particular code-sample. \n"
"2. Your code samples should belong to the one of the supported languages. \n"
"Supported languages are: Java, Kotlin, Python. \n"
f"3. Check that '{ColumnName.LANG.value}' column cells are filled with "
"acceptable language-names: \n"
f"Acceptable language-names are: {LanguageVersion.PYTHON_3.value}, "
f"{LanguageVersion.JAVA_8.value} ,"
f"{LanguageVersion.JAVA_11.value} and {LanguageVersion.KOTLIN.value}.")
42 changes: 42 additions & 0 deletions src/python/evaluation/common/xlsx_util.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import logging.config
from pathlib import Path
from typing import Union

import pandas as pd
from openpyxl import load_workbook, Workbook
from src.python.evaluation.evaluation_config import EvaluationConfig

logger = logging.getLogger(__name__)


def remove_sheet(workbook_path: Union[str, Path], sheet_name: str, to_raise_error: bool = False) -> None:
try:
workbook = load_workbook(workbook_path)
workbook.remove(workbook[sheet_name])
workbook.save(workbook_path)

except KeyError as e:
message = f'Sheet with specified name: {sheet_name} does not exist.'
if to_raise_error:
logger.exception(message)
raise e
else:
logger.info(message)


def create_and_get_workbook_path(config: EvaluationConfig) -> Path:
workbook = Workbook()
workbook_path = config.get_output_file_path()
workbook.save(workbook_path)
return workbook_path


def write_dataframe_to_xlsx_sheet(xlsx_file_path: Union[str, Path], df: pd.DataFrame, sheet_name: str,
mode: str = 'a', to_write_row_names: bool = False) -> None:
"""
mode: str Available values are {'w', 'a'}. File mode to use (write or append).
to_write_row_names: bool Write row names.
"""

with pd.ExcelWriter(xlsx_file_path, mode=mode) as writer:
df.to_excel(writer, sheet_name=sheet_name, index=to_write_row_names)
43 changes: 43 additions & 0 deletions src/python/evaluation/evaluation_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import logging.config
from argparse import Namespace
from pathlib import Path
from typing import List, Union

from src.python.common.tool_arguments import RunToolArgument
from src.python.evaluation.common.util import EvaluationArgument
from src.python.review.application_config import LanguageVersion
from src.python.review.common.file_system import create_directory

logger = logging.getLogger(__name__)


class EvaluationConfig:
def __init__(self, args: Namespace):
self.tool_path: Union[str, Path] = args.tool_path
self.output_format: str = args.format
self.xlsx_file_path: Union[str, Path] = args.xlsx_file_path
self.traceback: bool = args.traceback
self.output_folder_path: Union[str, Path] = args.output_folder_path
self.output_file_name: str = args.output_file_name

def build_command(self, inspected_file_path: Union[str, Path], lang: str) -> List[str]:
command = [LanguageVersion.PYTHON_3.value,
self.tool_path,
inspected_file_path,
RunToolArgument.FORMAT.value.short_name, self.output_format]

if lang == LanguageVersion.JAVA_8.value or lang == LanguageVersion.JAVA_11.value:
command.extend([RunToolArgument.LANG_VERSION.value.long_name, lang])
return command

def get_output_file_path(self) -> Path:
if self.output_folder_path is None:
try:
self.output_folder_path = (
Path(self.xlsx_file_path).parent.parent / EvaluationArgument.RESULT_FILE_NAME.value
)
create_directory(self.output_folder_path)
except FileNotFoundError as e:
logger.error('XLSX-file with the specified name does not exists.')
raise e
return Path(self.output_folder_path) / self.output_file_name
Loading