-
Notifications
You must be signed in to change notification settings - Fork 0
/
strategy_generator.py
127 lines (96 loc) · 4.21 KB
/
strategy_generator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import meta_class
import os
from utils import wrap, print_class_must_have_func, generate_commands_add_func, print_class_must_have_decors, \
print_class_must_have_base, generate_commands_add_base
def create_context():
print('You are creating a context class for Strategy pattern.')
context = meta_class.MetaClass()
context._add_class_name()
class_name = context.name
base_classes = []
commands = generate_commands_add_base(base_classes)
wrap(context._add_base_names, commands)
print_class_must_have_base(class_name, base_classes, True)
context._add_base_names()
curr_func = '__init__'
curr_params = ['strategy']
curr_decors = []
commands = generate_commands_add_func(curr_func, curr_params, curr_decors)
wrap(context._add_method, commands)
print_class_must_have_func(class_name, curr_func, curr_params, True)
context._add_args_to_method(curr_func)
print_class_must_have_decors(class_name, curr_func, curr_decors, True)
context._add_method_decorator(curr_func)
curr_func = 'context_interface'
curr_params = []
curr_decors = []
commands = generate_commands_add_func(curr_func, curr_params, curr_decors)
wrap(context._add_method, commands)
print_class_must_have_func(class_name, curr_func, curr_params, True)
context._add_args_to_method(curr_func)
print_class_must_have_decors(class_name, curr_func, curr_decors, True)
context._add_method_decorator(curr_func)
context._add_methods()
return context
def create_base_strategy():
print('You are creating a base class for Strategy in Strategy pattern.')
strategy = meta_class.MetaClass()
strategy._add_class_name()
class_name = strategy.name
base_names = ['ABC']
commands = generate_commands_add_base(base_names)
wrap(strategy._add_base_names, commands)
print_class_must_have_base(class_name, base_names, True)
strategy._add_base_names()
curr_func = 'algorithm_interface'
curr_params = []
curr_decors = ['abstractmethod']
commands = generate_commands_add_func(curr_func, curr_params, curr_decors)
wrap(strategy._add_method, commands)
print_class_must_have_func(class_name, curr_func, curr_params, True)
strategy._add_args_to_method(curr_func)
print_class_must_have_decors(class_name, curr_func, curr_decors, True)
strategy._add_method_decorator(curr_func)
strategy._add_methods()
return strategy
def create_concrete_strategy(base_state_name):
print('You are creating a concrete class for Strategy in Strategy pattern.')
strategy = meta_class.MetaClass()
strategy._add_class_name()
class_name = strategy.name
base_names = [base_state_name]
commands = generate_commands_add_base(base_names)
wrap(strategy._add_base_names, commands)
print_class_must_have_base(class_name, base_names, True)
strategy._add_base_names()
curr_func = 'algorithm_interface'
curr_params = []
curr_decors = []
commands = generate_commands_add_func(curr_func, curr_params, curr_decors)
wrap(strategy._add_method, commands)
print_class_must_have_func(class_name, curr_func, curr_params, True)
strategy._add_args_to_method(curr_func)
print_class_must_have_decors(class_name, curr_func, curr_decors, True)
strategy._add_method_decorator(curr_func)
strategy._add_methods()
return strategy
def strategy_generator():
context = create_context()
base_strategy = create_base_strategy()
concrete_strategies = []
for i in range(int(input('Enter number of concrete Strategy classes: '))):
concrete_strategy = create_concrete_strategy(base_strategy.name)
concrete_strategies.append(concrete_strategy)
folder, file = context.write_class()
base_strategy.write_class(folder, file)
for concrete_strategy in concrete_strategies:
concrete_strategy.write_class(folder, file)
path = os.path.join(os.getcwd(), folder)
with open(os.path.join(path, file + '.py'), 'r') as f:
lines = f.readlines()
lines.insert(0, 'from abc import ABC, abstractmethod\n')
with open(os.path.join(path, file + '.py'), 'w') as f:
f.writelines(lines)
return folder, file, context.name
if __name__ == '__main__':
strategy_generator()