wzrdbrain 0.1.3__tar.gz → 0.1.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wzrdbrain-0.1.4/PKG-INFO +107 -0
- wzrdbrain-0.1.4/README.md +82 -0
- {wzrdbrain-0.1.3 → wzrdbrain-0.1.4}/pyproject.toml +13 -21
- wzrdbrain-0.1.4/setup.cfg +4 -0
- wzrdbrain-0.1.4/src/wzrdbrain/__init__.py +10 -0
- wzrdbrain-0.1.4/src/wzrdbrain/wzrdbrain.py +159 -0
- wzrdbrain-0.1.4/src/wzrdbrain.egg-info/PKG-INFO +107 -0
- wzrdbrain-0.1.4/src/wzrdbrain.egg-info/SOURCES.txt +11 -0
- wzrdbrain-0.1.4/src/wzrdbrain.egg-info/dependency_links.txt +1 -0
- wzrdbrain-0.1.4/src/wzrdbrain.egg-info/requires.txt +7 -0
- wzrdbrain-0.1.4/src/wzrdbrain.egg-info/top_level.txt +1 -0
- wzrdbrain-0.1.4/tests/test_wzrdbrain.py +77 -0
- wzrdbrain-0.1.3/.github/workflows/ci.yml +0 -30
- wzrdbrain-0.1.3/.github/workflows/release.yml +0 -30
- wzrdbrain-0.1.3/.gitignore +0 -19
- wzrdbrain-0.1.3/CODE_OF_CONDUCT.md +0 -4
- wzrdbrain-0.1.3/CONTRIBUTING.md +0 -65
- wzrdbrain-0.1.3/PKG-INFO +0 -66
- wzrdbrain-0.1.3/README.md +0 -31
- wzrdbrain-0.1.3/src/wzrdbrain/__init__.py +0 -10
- wzrdbrain-0.1.3/src/wzrdbrain/wzrdbrain.py +0 -84
- wzrdbrain-0.1.3/tests/test_wzrdbrain.py +0 -75
- {wzrdbrain-0.1.3 → wzrdbrain-0.1.4}/LICENSE +0 -0
wzrdbrain-0.1.4/PKG-INFO
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: wzrdbrain
|
3
|
+
Version: 0.1.4
|
4
|
+
Summary: A simple library to generate trick combinations for wizard skating.
|
5
|
+
Author: nazroll
|
6
|
+
License-Expression: Apache-2.0
|
7
|
+
Project-URL: Homepage, https://github.com/nazroll/wzrdbrain
|
8
|
+
Project-URL: Documentation, https://github.com/nazroll/wzrdbrain#readme
|
9
|
+
Project-URL: Repository, https://github.com/nazroll/wzrdbrain
|
10
|
+
Project-URL: Issues, https://github.com/nazroll/wzrdbrain/issues
|
11
|
+
Keywords: wizard skating,tricks,random,generator,inline skating
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
13
|
+
Classifier: Topic :: Games/Entertainment
|
14
|
+
Classifier: Topic :: Software Development :: Libraries
|
15
|
+
Requires-Python: >=3.9
|
16
|
+
Description-Content-Type: text/markdown
|
17
|
+
License-File: LICENSE
|
18
|
+
Provides-Extra: dev
|
19
|
+
Requires-Dist: pytest; extra == "dev"
|
20
|
+
Requires-Dist: ruff; extra == "dev"
|
21
|
+
Requires-Dist: black; extra == "dev"
|
22
|
+
Requires-Dist: mypy; extra == "dev"
|
23
|
+
Requires-Dist: build; extra == "dev"
|
24
|
+
Dynamic: license-file
|
25
|
+
|
26
|
+
# wzrdbrain
|
27
|
+
|
28
|
+
A library to generate random trick combinations for wizard skating.
|
29
|
+
|
30
|
+
## Installation
|
31
|
+
|
32
|
+
```bash
|
33
|
+
pip install wzrdbrain
|
34
|
+
```
|
35
|
+
|
36
|
+
## Usage
|
37
|
+
|
38
|
+
The primary function is `generate_combo`, which returns a list of trick dictionaries. You can also create `Trick` objects directly for more control.
|
39
|
+
|
40
|
+
```python
|
41
|
+
from wzrdbrain import generate_combo, Trick
|
42
|
+
|
43
|
+
# Generate a combo of 3 tricks
|
44
|
+
combo = generate_combo(3)
|
45
|
+
|
46
|
+
# The output is a list of dictionaries, each representing a trick
|
47
|
+
# print(combo)
|
48
|
+
# Example output:
|
49
|
+
# [
|
50
|
+
# {
|
51
|
+
# 'direction': 'front', 'stance': 'open', 'move': 'gazelle',
|
52
|
+
# 'enter_into_trick': 'front', 'exit_from_trick': 'back',
|
53
|
+
# 'name': 'front open gazelle'
|
54
|
+
# },
|
55
|
+
# {
|
56
|
+
# 'direction': 'back', 'stance': None, 'move': '360',
|
57
|
+
# 'enter_into_trick': 'back', 'exit_from_trick': 'back',
|
58
|
+
# 'name': 'fakie 360'
|
59
|
+
# },
|
60
|
+
# # ... and so on
|
61
|
+
# ]
|
62
|
+
|
63
|
+
# To get just the names of the tricks in the combo:
|
64
|
+
trick_names = [trick['name'] for trick in combo]
|
65
|
+
print(trick_names)
|
66
|
+
# Example output: ['front open gazelle', 'fakie 360', 'back open lion']
|
67
|
+
```
|
68
|
+
|
69
|
+
### Creating a Trick Object
|
70
|
+
|
71
|
+
You can create a `Trick` object with specific attributes. Any attributes not provided will be randomly generated.
|
72
|
+
|
73
|
+
```python
|
74
|
+
# Create a trick with a specific move
|
75
|
+
my_trick = Trick(move="lion s")
|
76
|
+
|
77
|
+
# Print the full trick object as a dictionary
|
78
|
+
print(my_trick.to_dict())
|
79
|
+
# Example output:
|
80
|
+
# {
|
81
|
+
# 'direction': 'back', 'stance': 'closed', 'move': 'lion s',
|
82
|
+
# 'enter_into_trick': 'back', 'exit_from_trick': 'back',
|
83
|
+
# 'name': 'back closed lion s'
|
84
|
+
# }
|
85
|
+
```
|
86
|
+
|
87
|
+
## Development
|
88
|
+
|
89
|
+
To contribute to this project, please see the [Contributing Guide](CONTRIBUTING.md).
|
90
|
+
|
91
|
+
First, clone the repository and install the project in editable mode with its development dependencies:
|
92
|
+
|
93
|
+
```bash
|
94
|
+
git clone https://github.com/nazroll/wzrdbrain.git
|
95
|
+
cd wzrdbrain
|
96
|
+
pip install -e .[dev]
|
97
|
+
```
|
98
|
+
|
99
|
+
You can run the test suite using `pytest`:
|
100
|
+
|
101
|
+
```bash
|
102
|
+
pytest
|
103
|
+
```
|
104
|
+
|
105
|
+
## List of wizard skating tricks
|
106
|
+
|
107
|
+
The list of tricks in this library is not comprehensive. Please create an issue and give us your suggestions of new tricks
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# wzrdbrain
|
2
|
+
|
3
|
+
A library to generate random trick combinations for wizard skating.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
```bash
|
8
|
+
pip install wzrdbrain
|
9
|
+
```
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
|
13
|
+
The primary function is `generate_combo`, which returns a list of trick dictionaries. You can also create `Trick` objects directly for more control.
|
14
|
+
|
15
|
+
```python
|
16
|
+
from wzrdbrain import generate_combo, Trick
|
17
|
+
|
18
|
+
# Generate a combo of 3 tricks
|
19
|
+
combo = generate_combo(3)
|
20
|
+
|
21
|
+
# The output is a list of dictionaries, each representing a trick
|
22
|
+
# print(combo)
|
23
|
+
# Example output:
|
24
|
+
# [
|
25
|
+
# {
|
26
|
+
# 'direction': 'front', 'stance': 'open', 'move': 'gazelle',
|
27
|
+
# 'enter_into_trick': 'front', 'exit_from_trick': 'back',
|
28
|
+
# 'name': 'front open gazelle'
|
29
|
+
# },
|
30
|
+
# {
|
31
|
+
# 'direction': 'back', 'stance': None, 'move': '360',
|
32
|
+
# 'enter_into_trick': 'back', 'exit_from_trick': 'back',
|
33
|
+
# 'name': 'fakie 360'
|
34
|
+
# },
|
35
|
+
# # ... and so on
|
36
|
+
# ]
|
37
|
+
|
38
|
+
# To get just the names of the tricks in the combo:
|
39
|
+
trick_names = [trick['name'] for trick in combo]
|
40
|
+
print(trick_names)
|
41
|
+
# Example output: ['front open gazelle', 'fakie 360', 'back open lion']
|
42
|
+
```
|
43
|
+
|
44
|
+
### Creating a Trick Object
|
45
|
+
|
46
|
+
You can create a `Trick` object with specific attributes. Any attributes not provided will be randomly generated.
|
47
|
+
|
48
|
+
```python
|
49
|
+
# Create a trick with a specific move
|
50
|
+
my_trick = Trick(move="lion s")
|
51
|
+
|
52
|
+
# Print the full trick object as a dictionary
|
53
|
+
print(my_trick.to_dict())
|
54
|
+
# Example output:
|
55
|
+
# {
|
56
|
+
# 'direction': 'back', 'stance': 'closed', 'move': 'lion s',
|
57
|
+
# 'enter_into_trick': 'back', 'exit_from_trick': 'back',
|
58
|
+
# 'name': 'back closed lion s'
|
59
|
+
# }
|
60
|
+
```
|
61
|
+
|
62
|
+
## Development
|
63
|
+
|
64
|
+
To contribute to this project, please see the [Contributing Guide](CONTRIBUTING.md).
|
65
|
+
|
66
|
+
First, clone the repository and install the project in editable mode with its development dependencies:
|
67
|
+
|
68
|
+
```bash
|
69
|
+
git clone https://github.com/nazroll/wzrdbrain.git
|
70
|
+
cd wzrdbrain
|
71
|
+
pip install -e .[dev]
|
72
|
+
```
|
73
|
+
|
74
|
+
You can run the test suite using `pytest`:
|
75
|
+
|
76
|
+
```bash
|
77
|
+
pytest
|
78
|
+
```
|
79
|
+
|
80
|
+
## List of wizard skating tricks
|
81
|
+
|
82
|
+
The list of tricks in this library is not comprehensive. Please create an issue and give us your suggestions of new tricks
|
@@ -1,11 +1,11 @@
|
|
1
1
|
[build-system]
|
2
|
-
requires = ["
|
3
|
-
build-backend = "
|
2
|
+
requires = ["setuptools>=61.0"]
|
3
|
+
build-backend = "setuptools.build_meta"
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "wzrdbrain"
|
7
|
-
version = "0.1.
|
8
|
-
description = "A simple library to generate
|
7
|
+
version = "0.1.4"
|
8
|
+
description = "A simple library to generate trick combinations for wizard skating."
|
9
9
|
readme = "README.md"
|
10
10
|
requires-python = ">=3.9"
|
11
11
|
license = "Apache-2.0"
|
@@ -14,29 +14,18 @@ authors = [
|
|
14
14
|
]
|
15
15
|
keywords = ["wizard skating", "tricks", "random", "generator", "inline skating"]
|
16
16
|
classifiers = [
|
17
|
-
"Development Status :: 5 - Production/Stable",
|
18
|
-
"Intended Audience :: Developers",
|
19
|
-
"License :: OSI Approved :: Apache Software License",
|
20
|
-
"Programming Language :: Python",
|
21
17
|
"Programming Language :: Python :: 3",
|
22
|
-
"Programming Language :: Python :: 3 :: Only",
|
23
|
-
"Programming Language :: Python :: 3.9",
|
24
|
-
"Programming Language :: Python :: 3.10",
|
25
|
-
"Programming Language :: Python :: 3.11",
|
26
|
-
"Programming Language :: Python :: 3.12",
|
27
|
-
"Programming Language :: Python :: 3.13",
|
28
|
-
"Typing :: Typed",
|
29
18
|
"Topic :: Games/Entertainment",
|
30
19
|
"Topic :: Software Development :: Libraries",
|
31
20
|
]
|
32
21
|
|
33
22
|
[project.optional-dependencies]
|
34
23
|
dev = [
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
24
|
+
"pytest",
|
25
|
+
"ruff",
|
26
|
+
"black",
|
27
|
+
"mypy",
|
28
|
+
"build"
|
40
29
|
]
|
41
30
|
|
42
31
|
[project.urls]
|
@@ -57,9 +46,12 @@ lint.extend-ignore = ["E501"]
|
|
57
46
|
line-length = 100
|
58
47
|
|
59
48
|
[tool.pytest.ini_options]
|
49
|
+
pythonpath = ["src"]
|
60
50
|
testpaths = ["tests"]
|
61
|
-
addopts = "-q"
|
62
51
|
|
63
52
|
[tool.mypy]
|
64
53
|
strict = true
|
65
54
|
warn_unused_ignores = true
|
55
|
+
|
56
|
+
[tool.setuptools.packages.find]
|
57
|
+
where = ["src"]
|
@@ -0,0 +1,159 @@
|
|
1
|
+
import random
|
2
|
+
from typing import Optional, Any
|
3
|
+
from dataclasses import dataclass, asdict
|
4
|
+
|
5
|
+
# Trick data definitions
|
6
|
+
DIRECTIONS = ("front", "back")
|
7
|
+
STANCES = ("open", "closed")
|
8
|
+
MOVES = (
|
9
|
+
"predator",
|
10
|
+
"predator one",
|
11
|
+
"parallel",
|
12
|
+
"tree",
|
13
|
+
"gazelle",
|
14
|
+
"gazelle s",
|
15
|
+
"lion",
|
16
|
+
"lion s",
|
17
|
+
"toe press",
|
18
|
+
"heel press",
|
19
|
+
"toe roll",
|
20
|
+
"heel roll",
|
21
|
+
"360",
|
22
|
+
"180",
|
23
|
+
"540", # Added missing move
|
24
|
+
"parallel slide",
|
25
|
+
"soul slide",
|
26
|
+
"acid slide",
|
27
|
+
"mizu slide",
|
28
|
+
"star slide",
|
29
|
+
"fast slide",
|
30
|
+
"back slide",
|
31
|
+
)
|
32
|
+
# Moves that only occurs as the first trick for a combo
|
33
|
+
only_first = {"predator", "predator one", "parallel"}
|
34
|
+
|
35
|
+
# Moves that use "fakie" instead of "back"
|
36
|
+
use_fakie = {
|
37
|
+
"toe press",
|
38
|
+
"toe roll",
|
39
|
+
"heel press",
|
40
|
+
"heel roll",
|
41
|
+
"360",
|
42
|
+
"180",
|
43
|
+
"540",
|
44
|
+
"parallel slide",
|
45
|
+
"soul slide",
|
46
|
+
"acid slide",
|
47
|
+
"mizu slide",
|
48
|
+
"star slide",
|
49
|
+
"fast slide",
|
50
|
+
"back slide",
|
51
|
+
}
|
52
|
+
|
53
|
+
# Moves that don't have an open/closed stance
|
54
|
+
exclude_stance = {
|
55
|
+
"predator",
|
56
|
+
"predator one",
|
57
|
+
}.union(use_fakie)
|
58
|
+
|
59
|
+
|
60
|
+
@dataclass
|
61
|
+
class Trick:
|
62
|
+
direction: Optional[str] = None
|
63
|
+
stance: Optional[str] = None
|
64
|
+
move: Optional[str] = None
|
65
|
+
enter_into_trick: Optional[str] = None
|
66
|
+
exit_from_trick: Optional[str] = None
|
67
|
+
|
68
|
+
def __post_init__(self) -> None:
|
69
|
+
"""
|
70
|
+
Validate inputs and set random defaults for any attributes that were not provided.
|
71
|
+
"""
|
72
|
+
# Input validation
|
73
|
+
if self.direction is not None and self.direction not in DIRECTIONS:
|
74
|
+
raise ValueError(f"Invalid direction: '{self.direction}'. Must be one of {DIRECTIONS}")
|
75
|
+
if self.stance is not None and self.stance not in STANCES:
|
76
|
+
raise ValueError(f"Invalid stance: '{self.stance}'. Must be one of {STANCES}")
|
77
|
+
if self.move is not None and self.move not in MOVES:
|
78
|
+
raise ValueError(f"Invalid move: '{self.move}'. Must be one of {MOVES}")
|
79
|
+
|
80
|
+
# Generate default values
|
81
|
+
if self.direction is None:
|
82
|
+
self.direction = random.choice(DIRECTIONS)
|
83
|
+
|
84
|
+
if self.move is None:
|
85
|
+
self.move = random.choice(MOVES)
|
86
|
+
|
87
|
+
if self.enter_into_trick is None:
|
88
|
+
self.enter_into_trick = self.direction
|
89
|
+
|
90
|
+
if self.exit_from_trick is None:
|
91
|
+
self.exit_from_trick = self.direction
|
92
|
+
|
93
|
+
# Automatically determine stance if not provided
|
94
|
+
if self.stance is None and self.move not in exclude_stance:
|
95
|
+
self.stance = random.choice(STANCES)
|
96
|
+
|
97
|
+
# Update exit direction for moves that rotate the body
|
98
|
+
if self.move in ["gazelle", "lion", "180", "540"]:
|
99
|
+
if self.direction == "back":
|
100
|
+
self.exit_from_trick = "front"
|
101
|
+
elif self.direction == "front":
|
102
|
+
self.exit_from_trick = "back"
|
103
|
+
|
104
|
+
def __str__(self) -> str:
|
105
|
+
parts = []
|
106
|
+
display_direction = self.direction
|
107
|
+
# Handle fakie/forward display name
|
108
|
+
if self.move in use_fakie:
|
109
|
+
if self.direction == "back":
|
110
|
+
display_direction = "fakie"
|
111
|
+
elif self.direction == "front":
|
112
|
+
display_direction = "forward"
|
113
|
+
|
114
|
+
if display_direction:
|
115
|
+
parts.append(display_direction)
|
116
|
+
if self.stance:
|
117
|
+
parts.append(self.stance)
|
118
|
+
if self.move:
|
119
|
+
parts.append(self.move)
|
120
|
+
|
121
|
+
return " ".join(parts)
|
122
|
+
|
123
|
+
def to_dict(self) -> dict[str, Any]:
|
124
|
+
"""Returns a dictionary representation of the trick, including its full name."""
|
125
|
+
data = asdict(self)
|
126
|
+
data["name"] = str(self)
|
127
|
+
return data
|
128
|
+
|
129
|
+
|
130
|
+
# Generate a combination of tricks. Default is a random number from 2 until 5.
|
131
|
+
def generate_combo(num_of_tricks: Optional[int] = None) -> list[dict[str, Any]]:
|
132
|
+
if num_of_tricks is None:
|
133
|
+
num_of_tricks = random.randint(2, 5)
|
134
|
+
|
135
|
+
if num_of_tricks <= 0:
|
136
|
+
return []
|
137
|
+
|
138
|
+
trick_objects: list[Trick] = []
|
139
|
+
previous_trick: Optional[Trick] = None
|
140
|
+
|
141
|
+
for _ in range(num_of_tricks):
|
142
|
+
if previous_trick is None:
|
143
|
+
# Generate the first trick without constraints
|
144
|
+
new_trick = Trick()
|
145
|
+
else:
|
146
|
+
# Generate subsequent tricks based on the previous one's exit
|
147
|
+
required_direction = previous_trick.exit_from_trick
|
148
|
+
# Loop until we generate a valid trick for this position
|
149
|
+
while True:
|
150
|
+
candidate_trick = Trick(direction=required_direction)
|
151
|
+
if candidate_trick.move not in only_first:
|
152
|
+
new_trick = candidate_trick
|
153
|
+
break
|
154
|
+
|
155
|
+
trick_objects.append(new_trick)
|
156
|
+
previous_trick = new_trick
|
157
|
+
|
158
|
+
# Convert all trick objects to dictionaries for the final output
|
159
|
+
return [trick.to_dict() for trick in trick_objects]
|
@@ -0,0 +1,107 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: wzrdbrain
|
3
|
+
Version: 0.1.4
|
4
|
+
Summary: A simple library to generate trick combinations for wizard skating.
|
5
|
+
Author: nazroll
|
6
|
+
License-Expression: Apache-2.0
|
7
|
+
Project-URL: Homepage, https://github.com/nazroll/wzrdbrain
|
8
|
+
Project-URL: Documentation, https://github.com/nazroll/wzrdbrain#readme
|
9
|
+
Project-URL: Repository, https://github.com/nazroll/wzrdbrain
|
10
|
+
Project-URL: Issues, https://github.com/nazroll/wzrdbrain/issues
|
11
|
+
Keywords: wizard skating,tricks,random,generator,inline skating
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
13
|
+
Classifier: Topic :: Games/Entertainment
|
14
|
+
Classifier: Topic :: Software Development :: Libraries
|
15
|
+
Requires-Python: >=3.9
|
16
|
+
Description-Content-Type: text/markdown
|
17
|
+
License-File: LICENSE
|
18
|
+
Provides-Extra: dev
|
19
|
+
Requires-Dist: pytest; extra == "dev"
|
20
|
+
Requires-Dist: ruff; extra == "dev"
|
21
|
+
Requires-Dist: black; extra == "dev"
|
22
|
+
Requires-Dist: mypy; extra == "dev"
|
23
|
+
Requires-Dist: build; extra == "dev"
|
24
|
+
Dynamic: license-file
|
25
|
+
|
26
|
+
# wzrdbrain
|
27
|
+
|
28
|
+
A library to generate random trick combinations for wizard skating.
|
29
|
+
|
30
|
+
## Installation
|
31
|
+
|
32
|
+
```bash
|
33
|
+
pip install wzrdbrain
|
34
|
+
```
|
35
|
+
|
36
|
+
## Usage
|
37
|
+
|
38
|
+
The primary function is `generate_combo`, which returns a list of trick dictionaries. You can also create `Trick` objects directly for more control.
|
39
|
+
|
40
|
+
```python
|
41
|
+
from wzrdbrain import generate_combo, Trick
|
42
|
+
|
43
|
+
# Generate a combo of 3 tricks
|
44
|
+
combo = generate_combo(3)
|
45
|
+
|
46
|
+
# The output is a list of dictionaries, each representing a trick
|
47
|
+
# print(combo)
|
48
|
+
# Example output:
|
49
|
+
# [
|
50
|
+
# {
|
51
|
+
# 'direction': 'front', 'stance': 'open', 'move': 'gazelle',
|
52
|
+
# 'enter_into_trick': 'front', 'exit_from_trick': 'back',
|
53
|
+
# 'name': 'front open gazelle'
|
54
|
+
# },
|
55
|
+
# {
|
56
|
+
# 'direction': 'back', 'stance': None, 'move': '360',
|
57
|
+
# 'enter_into_trick': 'back', 'exit_from_trick': 'back',
|
58
|
+
# 'name': 'fakie 360'
|
59
|
+
# },
|
60
|
+
# # ... and so on
|
61
|
+
# ]
|
62
|
+
|
63
|
+
# To get just the names of the tricks in the combo:
|
64
|
+
trick_names = [trick['name'] for trick in combo]
|
65
|
+
print(trick_names)
|
66
|
+
# Example output: ['front open gazelle', 'fakie 360', 'back open lion']
|
67
|
+
```
|
68
|
+
|
69
|
+
### Creating a Trick Object
|
70
|
+
|
71
|
+
You can create a `Trick` object with specific attributes. Any attributes not provided will be randomly generated.
|
72
|
+
|
73
|
+
```python
|
74
|
+
# Create a trick with a specific move
|
75
|
+
my_trick = Trick(move="lion s")
|
76
|
+
|
77
|
+
# Print the full trick object as a dictionary
|
78
|
+
print(my_trick.to_dict())
|
79
|
+
# Example output:
|
80
|
+
# {
|
81
|
+
# 'direction': 'back', 'stance': 'closed', 'move': 'lion s',
|
82
|
+
# 'enter_into_trick': 'back', 'exit_from_trick': 'back',
|
83
|
+
# 'name': 'back closed lion s'
|
84
|
+
# }
|
85
|
+
```
|
86
|
+
|
87
|
+
## Development
|
88
|
+
|
89
|
+
To contribute to this project, please see the [Contributing Guide](CONTRIBUTING.md).
|
90
|
+
|
91
|
+
First, clone the repository and install the project in editable mode with its development dependencies:
|
92
|
+
|
93
|
+
```bash
|
94
|
+
git clone https://github.com/nazroll/wzrdbrain.git
|
95
|
+
cd wzrdbrain
|
96
|
+
pip install -e .[dev]
|
97
|
+
```
|
98
|
+
|
99
|
+
You can run the test suite using `pytest`:
|
100
|
+
|
101
|
+
```bash
|
102
|
+
pytest
|
103
|
+
```
|
104
|
+
|
105
|
+
## List of wizard skating tricks
|
106
|
+
|
107
|
+
The list of tricks in this library is not comprehensive. Please create an issue and give us your suggestions of new tricks
|
@@ -0,0 +1,11 @@
|
|
1
|
+
LICENSE
|
2
|
+
README.md
|
3
|
+
pyproject.toml
|
4
|
+
src/wzrdbrain/__init__.py
|
5
|
+
src/wzrdbrain/wzrdbrain.py
|
6
|
+
src/wzrdbrain.egg-info/PKG-INFO
|
7
|
+
src/wzrdbrain.egg-info/SOURCES.txt
|
8
|
+
src/wzrdbrain.egg-info/dependency_links.txt
|
9
|
+
src/wzrdbrain.egg-info/requires.txt
|
10
|
+
src/wzrdbrain.egg-info/top_level.txt
|
11
|
+
tests/test_wzrdbrain.py
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
wzrdbrain
|
@@ -0,0 +1,77 @@
|
|
1
|
+
import pytest
|
2
|
+
from wzrdbrain.wzrdbrain import Trick, generate_combo, DIRECTIONS, MOVES, STANCES, only_first
|
3
|
+
|
4
|
+
|
5
|
+
def test_trick_creation_with_validation() -> None:
|
6
|
+
"""Test that creating a Trick with invalid data raises a ValueError."""
|
7
|
+
with pytest.raises(ValueError, match="Invalid move"):
|
8
|
+
Trick(move="invalid_move")
|
9
|
+
with pytest.raises(ValueError, match="Invalid direction"):
|
10
|
+
Trick(direction="invalid_direction")
|
11
|
+
with pytest.raises(ValueError, match="Invalid stance"):
|
12
|
+
Trick(stance="invalid_stance")
|
13
|
+
|
14
|
+
|
15
|
+
def test_trick_default_creation() -> None:
|
16
|
+
"""Test creating a Trick with no arguments uses random defaults."""
|
17
|
+
trick = Trick()
|
18
|
+
assert isinstance(trick, Trick)
|
19
|
+
assert trick.move in MOVES
|
20
|
+
assert trick.direction in DIRECTIONS
|
21
|
+
if trick.move not in {"predator", "predator one"}:
|
22
|
+
# Stance should be None for predator moves, otherwise it should be set
|
23
|
+
if trick.stance:
|
24
|
+
assert trick.stance in STANCES
|
25
|
+
|
26
|
+
|
27
|
+
def test_trick_str_representation() -> None:
|
28
|
+
"""Test the string formatting of a Trick, including the 'fakie' logic."""
|
29
|
+
trick1 = Trick(direction="front", stance="open", move="gazelle")
|
30
|
+
assert str(trick1) == "front open gazelle"
|
31
|
+
|
32
|
+
trick2 = Trick(direction="back", move="360")
|
33
|
+
assert str(trick2) == "fakie 360"
|
34
|
+
|
35
|
+
trick3 = Trick(direction="front", move="soul slide")
|
36
|
+
assert str(trick3) == "forward soul slide"
|
37
|
+
|
38
|
+
|
39
|
+
def test_trick_to_dict() -> None:
|
40
|
+
"""Test the to_dict method includes the 'name' key."""
|
41
|
+
trick = Trick(direction="front", stance="open", move="gazelle")
|
42
|
+
trick_dict = trick.to_dict()
|
43
|
+
assert isinstance(trick_dict, dict)
|
44
|
+
assert "name" in trick_dict
|
45
|
+
assert trick_dict["name"] == "front open gazelle"
|
46
|
+
assert trick_dict["move"] == "gazelle"
|
47
|
+
|
48
|
+
|
49
|
+
def test_generate_combo_returns_list_of_dicts() -> None:
|
50
|
+
"""Test that generate_combo returns a list of trick dictionaries."""
|
51
|
+
combo = generate_combo(3)
|
52
|
+
assert isinstance(combo, list)
|
53
|
+
assert len(combo) == 3
|
54
|
+
for trick_dict in combo:
|
55
|
+
assert isinstance(trick_dict, dict)
|
56
|
+
assert "name" in trick_dict
|
57
|
+
assert "move" in trick_dict
|
58
|
+
|
59
|
+
|
60
|
+
def test_generate_combo_linking() -> None:
|
61
|
+
"""Test that tricks in a combo are linked by their exit/enter directions."""
|
62
|
+
# Generate a long combo to increase the chance of seeing rotation
|
63
|
+
combo = generate_combo(10)
|
64
|
+
for i in range(len(combo) - 1):
|
65
|
+
current_trick = combo[i]
|
66
|
+
next_trick = combo[i + 1]
|
67
|
+
assert current_trick["exit_from_trick"] == next_trick["enter_into_trick"]
|
68
|
+
|
69
|
+
|
70
|
+
def test_generate_combo_only_first_rule() -> None:
|
71
|
+
"""Test that moves in 'only_first' do not appear after the first trick."""
|
72
|
+
# Run multiple times to ensure rule is consistently applied
|
73
|
+
for _ in range(10):
|
74
|
+
combo = generate_combo(5)
|
75
|
+
# Check all tricks after the first one
|
76
|
+
for trick_dict in combo[1:]:
|
77
|
+
assert trick_dict["move"] not in only_first
|
@@ -1,30 +0,0 @@
|
|
1
|
-
name: CI
|
2
|
-
|
3
|
-
on:
|
4
|
-
push:
|
5
|
-
branches: ["**"]
|
6
|
-
pull_request:
|
7
|
-
|
8
|
-
jobs:
|
9
|
-
test:
|
10
|
-
runs-on: ubuntu-latest
|
11
|
-
strategy:
|
12
|
-
matrix:
|
13
|
-
python-version: ["3.9", "3.10", "3.11", "3.12"]
|
14
|
-
steps:
|
15
|
-
- uses: actions/checkout@v4
|
16
|
-
- uses: actions/setup-python@v5
|
17
|
-
with:
|
18
|
-
python-version: ${{ matrix.python-version }}
|
19
|
-
- name: Install package and dev deps
|
20
|
-
run: |
|
21
|
-
python -m pip install --upgrade pip
|
22
|
-
pip install -e ".[dev]"
|
23
|
-
- name: Lint (ruff)
|
24
|
-
run: ruff check .
|
25
|
-
- name: Format check (black)
|
26
|
-
run: black --check .
|
27
|
-
- name: Type check (mypy)
|
28
|
-
run: mypy .
|
29
|
-
- name: Tests (pytest)
|
30
|
-
run: pytest
|
@@ -1,30 +0,0 @@
|
|
1
|
-
name: Release
|
2
|
-
|
3
|
-
on:
|
4
|
-
release:
|
5
|
-
types: [published]
|
6
|
-
|
7
|
-
permissions:
|
8
|
-
contents: read
|
9
|
-
id-token: write # Required for PyPI Trusted Publishing
|
10
|
-
|
11
|
-
jobs:
|
12
|
-
build-and-publish:
|
13
|
-
runs-on: ubuntu-latest
|
14
|
-
steps:
|
15
|
-
- uses: actions/checkout@v4
|
16
|
-
- uses: actions/setup-python@v5
|
17
|
-
with:
|
18
|
-
python-version: "3.12"
|
19
|
-
- name: Build
|
20
|
-
run: |
|
21
|
-
python -m pip install --upgrade pip
|
22
|
-
pip install build
|
23
|
-
python -m build
|
24
|
-
- name: Publish to PyPI
|
25
|
-
uses: pypa/gh-action-pypi-publish@release/v1
|
26
|
-
with:
|
27
|
-
# To test first against TestPyPI, uncomment the next two lines and add a prerelease:
|
28
|
-
# repository-url: https://test.pypi.org/legacy/
|
29
|
-
# skip-existing: true
|
30
|
-
print-hash: true
|
wzrdbrain-0.1.3/.gitignore
DELETED
wzrdbrain-0.1.3/CONTRIBUTING.md
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
# Contributing to wzrdbrain
|
2
|
-
|
3
|
-
First off, thank you for considering contributing!
|
4
|
-
|
5
|
-
## Submitting Changes
|
6
|
-
|
7
|
-
1. Create a new branch for your feature or bug fix.
|
8
|
-
2. Make your changes and commit them.
|
9
|
-
3. Use clear, concise messages (e.g., feat: add X, fix: correct Y).
|
10
|
-
4. Ensure all quality checks pass.
|
11
|
-
5. Push your branch and open a pull request.
|
12
|
-
|
13
|
-
## Development Setup
|
14
|
-
|
15
|
-
To get started with development, follow these steps:
|
16
|
-
|
17
|
-
1. **Clone the repository:**
|
18
|
-
```bash
|
19
|
-
git clone <your-fork-url>
|
20
|
-
cd wzrdbrain
|
21
|
-
```
|
22
|
-
|
23
|
-
2. **Create and activate a virtual environment:**
|
24
|
-
```bash
|
25
|
-
python -m venv .venv
|
26
|
-
source .venv/bin/activate # On Windows use: .venv\Scripts\activate
|
27
|
-
```
|
28
|
-
|
29
|
-
3. **Install the package in editable mode with development dependencies:**
|
30
|
-
This command installs the project itself along with tools like `pytest`, `ruff`, and `mypy`.
|
31
|
-
```bash
|
32
|
-
pip install -e ".[dev]"
|
33
|
-
```
|
34
|
-
|
35
|
-
## Running Quality Checks
|
36
|
-
|
37
|
-
Before submitting a pull request, please ensure your code passes all quality checks.
|
38
|
-
|
39
|
-
### Linting and Formatting
|
40
|
-
|
41
|
-
We use `ruff` for linting and `black` for formatting.
|
42
|
-
|
43
|
-
```bash
|
44
|
-
# Check for linting errors
|
45
|
-
ruff check .
|
46
|
-
|
47
|
-
# Format the code
|
48
|
-
black .
|
49
|
-
```
|
50
|
-
|
51
|
-
### Type Checking
|
52
|
-
|
53
|
-
We use `mypy` for static type checking.
|
54
|
-
|
55
|
-
```bash
|
56
|
-
mypy .
|
57
|
-
```
|
58
|
-
|
59
|
-
### Running Tests
|
60
|
-
|
61
|
-
We use `pytest` for running unit tests.
|
62
|
-
|
63
|
-
```bash
|
64
|
-
pytest
|
65
|
-
```
|
wzrdbrain-0.1.3/PKG-INFO
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
Metadata-Version: 2.4
|
2
|
-
Name: wzrdbrain
|
3
|
-
Version: 0.1.3
|
4
|
-
Summary: A simple library to generate random trick combinations for wizard skating.
|
5
|
-
Project-URL: Homepage, https://github.com/nazroll/wzrdbrain
|
6
|
-
Project-URL: Documentation, https://github.com/nazroll/wzrdbrain#readme
|
7
|
-
Project-URL: Repository, https://github.com/nazroll/wzrdbrain
|
8
|
-
Project-URL: Issues, https://github.com/nazroll/wzrdbrain/issues
|
9
|
-
Author: nazroll
|
10
|
-
License-Expression: Apache-2.0
|
11
|
-
License-File: LICENSE
|
12
|
-
Keywords: generator,inline skating,random,tricks,wizard skating
|
13
|
-
Classifier: Development Status :: 5 - Production/Stable
|
14
|
-
Classifier: Intended Audience :: Developers
|
15
|
-
Classifier: License :: OSI Approved :: Apache Software License
|
16
|
-
Classifier: Programming Language :: Python
|
17
|
-
Classifier: Programming Language :: Python :: 3
|
18
|
-
Classifier: Programming Language :: Python :: 3 :: Only
|
19
|
-
Classifier: Programming Language :: Python :: 3.9
|
20
|
-
Classifier: Programming Language :: Python :: 3.10
|
21
|
-
Classifier: Programming Language :: Python :: 3.11
|
22
|
-
Classifier: Programming Language :: Python :: 3.12
|
23
|
-
Classifier: Programming Language :: Python :: 3.13
|
24
|
-
Classifier: Topic :: Games/Entertainment
|
25
|
-
Classifier: Topic :: Software Development :: Libraries
|
26
|
-
Classifier: Typing :: Typed
|
27
|
-
Requires-Python: >=3.9
|
28
|
-
Provides-Extra: dev
|
29
|
-
Requires-Dist: black>=24.3; extra == 'dev'
|
30
|
-
Requires-Dist: build>=1.2; extra == 'dev'
|
31
|
-
Requires-Dist: mypy>=1.10; extra == 'dev'
|
32
|
-
Requires-Dist: pytest>=8; extra == 'dev'
|
33
|
-
Requires-Dist: ruff>=0.5; extra == 'dev'
|
34
|
-
Description-Content-Type: text/markdown
|
35
|
-
|
36
|
-
# wzrdbrain
|
37
|
-
|
38
|
-
A simple library to generate random trick combinations for wizard skating.
|
39
|
-
|
40
|
-
## Installation
|
41
|
-
|
42
|
-
```bash
|
43
|
-
pip install wzrdbrain
|
44
|
-
```
|
45
|
-
|
46
|
-
## Usage
|
47
|
-
|
48
|
-
```python
|
49
|
-
from wzrdbrain import generate_trick, generate_combo
|
50
|
-
|
51
|
-
# Generate a single trick as a list of its parts
|
52
|
-
print(generate_trick())
|
53
|
-
# Example output: ['front', 'open', 'lion']
|
54
|
-
|
55
|
-
# Generate a line of multiple tricks as formatted strings
|
56
|
-
print(generate_combo(3))
|
57
|
-
# Example output: ['front parallel', 'fakie toe press', 'forward 360']
|
58
|
-
```
|
59
|
-
|
60
|
-
## List of wizard skating tricks
|
61
|
-
|
62
|
-
The list of tricks in this library is not comprehensive. Please create an issue and give us your suggestions of new tricks to be added.
|
63
|
-
|
64
|
-
## Contributing
|
65
|
-
|
66
|
-
Contributions are welcome! Please see the [Contributing Guide](CONTRIBUTING.md) for details on how to set up your development environment, run tests, and submit changes.
|
wzrdbrain-0.1.3/README.md
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
# wzrdbrain
|
2
|
-
|
3
|
-
A simple library to generate random trick combinations for wizard skating.
|
4
|
-
|
5
|
-
## Installation
|
6
|
-
|
7
|
-
```bash
|
8
|
-
pip install wzrdbrain
|
9
|
-
```
|
10
|
-
|
11
|
-
## Usage
|
12
|
-
|
13
|
-
```python
|
14
|
-
from wzrdbrain import generate_trick, generate_combo
|
15
|
-
|
16
|
-
# Generate a single trick as a list of its parts
|
17
|
-
print(generate_trick())
|
18
|
-
# Example output: ['front', 'open', 'lion']
|
19
|
-
|
20
|
-
# Generate a line of multiple tricks as formatted strings
|
21
|
-
print(generate_combo(3))
|
22
|
-
# Example output: ['front parallel', 'fakie toe press', 'forward 360']
|
23
|
-
```
|
24
|
-
|
25
|
-
## List of wizard skating tricks
|
26
|
-
|
27
|
-
The list of tricks in this library is not comprehensive. Please create an issue and give us your suggestions of new tricks to be added.
|
28
|
-
|
29
|
-
## Contributing
|
30
|
-
|
31
|
-
Contributions are welcome! Please see the [Contributing Guide](CONTRIBUTING.md) for details on how to set up your development environment, run tests, and submit changes.
|
@@ -1,84 +0,0 @@
|
|
1
|
-
import random
|
2
|
-
from typing import Optional
|
3
|
-
|
4
|
-
# Trick data definitions
|
5
|
-
direction = ("front", "back")
|
6
|
-
stance = ("open", "closed")
|
7
|
-
move = (
|
8
|
-
"predator",
|
9
|
-
"predator one",
|
10
|
-
"parallel",
|
11
|
-
"tree",
|
12
|
-
"gazelle",
|
13
|
-
"gazelle s",
|
14
|
-
"lion",
|
15
|
-
"lion s",
|
16
|
-
"toe press",
|
17
|
-
"heel press",
|
18
|
-
"toe roll",
|
19
|
-
"heel roll",
|
20
|
-
"360",
|
21
|
-
"180",
|
22
|
-
"parallel slide",
|
23
|
-
"soul slide",
|
24
|
-
"acid slide",
|
25
|
-
"mizu slide",
|
26
|
-
"star slide",
|
27
|
-
"fast slide",
|
28
|
-
"back slide",
|
29
|
-
)
|
30
|
-
|
31
|
-
# Moves that use "fakie" instead of "back"
|
32
|
-
use_fakie = {
|
33
|
-
"toe press",
|
34
|
-
"toe roll",
|
35
|
-
"heel press",
|
36
|
-
"heel roll",
|
37
|
-
"360",
|
38
|
-
"180",
|
39
|
-
"parallel slide",
|
40
|
-
"soul slide",
|
41
|
-
"acid slide",
|
42
|
-
"mizu slide",
|
43
|
-
"star slide",
|
44
|
-
"fast slide",
|
45
|
-
"back slide",
|
46
|
-
}
|
47
|
-
|
48
|
-
# Moves that don't have an open/closed stance
|
49
|
-
exclude_stance = {
|
50
|
-
"predator",
|
51
|
-
"predator one",
|
52
|
-
}.union(use_fakie)
|
53
|
-
|
54
|
-
|
55
|
-
# Generate a trick
|
56
|
-
def generate_trick() -> list[str]:
|
57
|
-
selected_move = random.choice(move)
|
58
|
-
trick = [random.choice(direction)]
|
59
|
-
|
60
|
-
if selected_move not in exclude_stance:
|
61
|
-
trick.append(random.choice(stance))
|
62
|
-
|
63
|
-
trick.append(selected_move)
|
64
|
-
return trick
|
65
|
-
|
66
|
-
|
67
|
-
# Generate a combination of tricks. Default setting is random, between 1-5 tricks.
|
68
|
-
def generate_combo(num_of_tricks: Optional[int] = None) -> list[str]:
|
69
|
-
if num_of_tricks is None:
|
70
|
-
num_of_tricks = random.randint(1, 5)
|
71
|
-
|
72
|
-
trick_line: list[str] = []
|
73
|
-
for i in range(num_of_tricks):
|
74
|
-
trick_parts = generate_trick()
|
75
|
-
# If the move uses the fakie semantics, convert the direction "front"/"back" to "forward"/"fakie"
|
76
|
-
if trick_parts:
|
77
|
-
move_name = trick_parts[-1]
|
78
|
-
if move_name in use_fakie:
|
79
|
-
if trick_parts[0] == "back":
|
80
|
-
trick_parts[0] = "fakie"
|
81
|
-
elif trick_parts[0] == "front":
|
82
|
-
trick_parts[0] = "forward"
|
83
|
-
trick_line.append(" ".join(trick_parts))
|
84
|
-
return trick_line
|
@@ -1,75 +0,0 @@
|
|
1
|
-
from pathlib import Path
|
2
|
-
import sys
|
3
|
-
from collections.abc import Iterator, Sequence
|
4
|
-
|
5
|
-
import pytest
|
6
|
-
|
7
|
-
# Ensure src is on path so we can import the module under test
|
8
|
-
ROOT = Path(__file__).resolve().parents[1]
|
9
|
-
SRC = ROOT / "src"
|
10
|
-
sys.path.insert(0, str(SRC))
|
11
|
-
|
12
|
-
import wzrdbrain.wzrdbrain as wb # noqa: E402
|
13
|
-
|
14
|
-
|
15
|
-
def test_generate_trick_exclude_stance(monkeypatch: pytest.MonkeyPatch) -> None:
|
16
|
-
# Force choices so selected_move is in exclude_stance ('predator')
|
17
|
-
def fake_choice(seq: Sequence[str]) -> str:
|
18
|
-
if seq is wb.move:
|
19
|
-
return "predator"
|
20
|
-
if seq is wb.direction:
|
21
|
-
return "front"
|
22
|
-
if seq is wb.stance:
|
23
|
-
return "open"
|
24
|
-
raise RuntimeError("unexpected seq")
|
25
|
-
|
26
|
-
# patch the module-level random.choice by target string to avoid mypy attr warnings
|
27
|
-
monkeypatch.setattr("wzrdbrain.wzrdbrain.random.choice", fake_choice)
|
28
|
-
trick = wb.generate_trick()
|
29
|
-
assert trick == ["front", "predator"]
|
30
|
-
|
31
|
-
|
32
|
-
def test_generate_trick_with_stance(monkeypatch: pytest.MonkeyPatch) -> None:
|
33
|
-
# Force choices so selected_move is NOT in exclude_stance ('parallel')
|
34
|
-
def fake_choice(seq: Sequence[str]) -> str:
|
35
|
-
if seq is wb.move:
|
36
|
-
return "parallel"
|
37
|
-
if seq is wb.direction:
|
38
|
-
return "back"
|
39
|
-
if seq is wb.stance:
|
40
|
-
return "open"
|
41
|
-
raise RuntimeError("unexpected seq")
|
42
|
-
|
43
|
-
monkeypatch.setattr("wzrdbrain.wzrdbrain.random.choice", fake_choice)
|
44
|
-
trick = wb.generate_trick()
|
45
|
-
assert trick == ["back", "open", "parallel"]
|
46
|
-
|
47
|
-
|
48
|
-
def test_generate_combo_fakie_conversion(monkeypatch: pytest.MonkeyPatch) -> None:
|
49
|
-
# Provide deterministic successive generate_trick outputs to test fakie/forward conversion
|
50
|
-
seq: Iterator[list[str]] = iter(
|
51
|
-
[
|
52
|
-
["front", "parallel"], # not in use_fakie -> unchanged
|
53
|
-
["back", "toe press"], # in use_fakie -> back -> fakie (since it's subsequent)
|
54
|
-
["front", "360"], # in use_fakie -> front -> forward
|
55
|
-
]
|
56
|
-
)
|
57
|
-
|
58
|
-
def fake_generate_trick() -> list[str]:
|
59
|
-
return next(seq)
|
60
|
-
|
61
|
-
monkeypatch.setattr(wb, "generate_trick", fake_generate_trick)
|
62
|
-
line = wb.generate_combo(3)
|
63
|
-
assert line == [
|
64
|
-
"front parallel",
|
65
|
-
"fakie toe press",
|
66
|
-
"forward 360",
|
67
|
-
]
|
68
|
-
|
69
|
-
|
70
|
-
def test_generate_combo_default_length() -> None:
|
71
|
-
# Default should produce between 1 and 5 tricks
|
72
|
-
line = wb.generate_combo()
|
73
|
-
assert 1 <= len(line) <= 5
|
74
|
-
for item in line:
|
75
|
-
assert isinstance(item, str)
|
File without changes
|