NumberSequenceGenerator 노드 추가 - 지정된 범위의 숫자를 반복 횟수만큼 출력

This commit is contained in:
Jisung, Ahn
2025-05-30 12:14:38 +09:00
parent 12955a9c1d
commit 7106f8bbe5
3 changed files with 151 additions and 2 deletions
+6 -2
View File
@@ -10,13 +10,16 @@ from .number_range_index import NODE_CLASS_MAPPINGS as RANGE_NODE_CLASS_MAPPINGS
from .number_range_index import NODE_DISPLAY_NAME_MAPPINGS as RANGE_NODE_DISPLAY_NAME_MAPPINGS
from .string_concatenator import NODE_CLASS_MAPPINGS as CONCAT_NODE_CLASS_MAPPINGS
from .string_concatenator import NODE_DISPLAY_NAME_MAPPINGS as CONCAT_NODE_DISPLAY_NAME_MAPPINGS
from .number_sequence_generator import NODE_CLASS_MAPPINGS as SEQUENCE_NODE_CLASS_MAPPINGS
from .number_sequence_generator import NODE_DISPLAY_NAME_MAPPINGS as SEQUENCE_NODE_DISPLAY_NAME_MAPPINGS
NODE_CLASS_MAPPINGS = {
**SWITCH_NODE_CLASS_MAPPINGS,
**CONDITION_NODE_CLASS_MAPPINGS,
**BOOLEAN_NODE_CLASS_MAPPINGS,
**RANGE_NODE_CLASS_MAPPINGS,
**CONCAT_NODE_CLASS_MAPPINGS
**CONCAT_NODE_CLASS_MAPPINGS,
**SEQUENCE_NODE_CLASS_MAPPINGS
}
NODE_DISPLAY_NAME_MAPPINGS = {
@@ -24,7 +27,8 @@ NODE_DISPLAY_NAME_MAPPINGS = {
**CONDITION_NODE_DISPLAY_NAME_MAPPINGS,
**BOOLEAN_NODE_DISPLAY_NAME_MAPPINGS,
**RANGE_NODE_DISPLAY_NAME_MAPPINGS,
**CONCAT_NODE_DISPLAY_NAME_MAPPINGS
**CONCAT_NODE_DISPLAY_NAME_MAPPINGS,
**SEQUENCE_NODE_DISPLAY_NAME_MAPPINGS
}
__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS']
+72
View File
@@ -0,0 +1,72 @@
class NumberSequenceGenerator:
"""
Number Sequence Generator Node: Generates a sequence of numbers with specified repetitions.
This node generates a sequence of numbers within a specified range (start_number to end_number),
repeating each number a specified number of times before moving to the next number.
Each time the node is executed, it outputs the next number in the sequence. When the sequence
is complete (after outputting the end_number the specified number of times), it starts over
from the beginning.
Usage examples:
- With start_number=1, end_number=3, repeat_count=2:
Outputs 1,1,2,2,3,3,1,1,2,2,3,3,... on successive executions
- With start_number=5, end_number=7, repeat_count=1:
Outputs 5,6,7,5,6,7,... on successive executions
"""
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"start_number": ("INT", {"default": 1, "min": 1, "max": 1000, "step": 1}),
"end_number": ("INT", {"default": 10, "min": 1, "max": 1000, "step": 1}),
"repeat_count": ("INT", {"default": 1, "min": 1, "max": 100, "step": 1}),
},
}
RETURN_TYPES = ("INT",)
RETURN_NAMES = "NUMBER"
FUNCTION = "generate_number"
CATEGORY = "Logic-Support"
# 클래스 변수로 현재 상태 저장
current_number = 1
current_repeat = 1
def generate_number(self, start_number, end_number, repeat_count):
# 범위 검증 - 시작 숫자가 종료 숫자보다 크면 값을 교환
if start_number > end_number:
start_number, end_number = end_number, start_number
# 클래스 변수가 현재 범위를 벗어나면 초기화
if (NumberSequenceGenerator.current_number < start_number or
NumberSequenceGenerator.current_number > end_number):
NumberSequenceGenerator.current_number = start_number
NumberSequenceGenerator.current_repeat = 1
# 현재 숫자 저장
result = NumberSequenceGenerator.current_number
# 반복 횟수 증가
NumberSequenceGenerator.current_repeat += 1
# 현재 숫자의 반복 횟수가 지정된 반복 횟수에 도달하면 다음 숫자로 이동
if NumberSequenceGenerator.current_repeat > repeat_count:
NumberSequenceGenerator.current_number += 1
NumberSequenceGenerator.current_repeat = 1
# 종료 숫자를 넘어가면 시작 숫자로 돌아감
if NumberSequenceGenerator.current_number > end_number:
NumberSequenceGenerator.current_number = start_number
return (result,)
NODE_CLASS_MAPPINGS = {
"NumberSequenceGenerator": NumberSequenceGenerator
}
NODE_DISPLAY_NAME_MAPPINGS = {
"NumberSequenceGenerator": "Number Sequence Generator"
}
+73
View File
@@ -0,0 +1,73 @@
import unittest
from number_sequence_generator import NumberSequenceGenerator
class TestNumberSequenceGenerator(unittest.TestCase):
def setUp(self):
# 각 테스트 전에 클래스 변수 초기화
NumberSequenceGenerator.current_number = 1
NumberSequenceGenerator.current_repeat = 1
self.generator = NumberSequenceGenerator()
def test_basic_sequence(self):
"""기본 시퀀스 생성 테스트 (1~3, 반복 1회)"""
# 1, 2, 3, 1, 2, 3 순서로 생성되어야 함
self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 1)
self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 2)
self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 3)
self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 1)
self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 2)
self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 3)
def test_repeated_sequence(self):
"""반복 시퀀스 생성 테스트 (1~3, 반복 2회)"""
# 1, 1, 2, 2, 3, 3, 1, 1 순서로 생성되어야 함
self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 1)
self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 1)
self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 2)
self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 2)
self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 3)
self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 3)
self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 1)
self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 1)
def test_range_validation(self):
"""범위 검증 테스트 (시작 숫자가 종료 숫자보다 큰 경우)"""
# 시작 숫자(10)가 종료 숫자(5)보다 크면 값이 교환되어야 함
# 따라서 5, 6, 7, 8, 9, 10 순서로 생성되어야 함
self.assertEqual(self.generator.generate_number(10, 5, 1)[0], 5)
self.assertEqual(self.generator.generate_number(10, 5, 1)[0], 6)
self.assertEqual(self.generator.generate_number(10, 5, 1)[0], 7)
self.assertEqual(self.generator.generate_number(10, 5, 1)[0], 8)
self.assertEqual(self.generator.generate_number(10, 5, 1)[0], 9)
self.assertEqual(self.generator.generate_number(10, 5, 1)[0], 10)
self.assertEqual(self.generator.generate_number(10, 5, 1)[0], 5)
def test_change_range(self):
"""범위 변경 테스트"""
# 처음에 1~3 범위 사용
self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 1)
self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 2)
# 범위를 5~7로 변경
self.assertEqual(self.generator.generate_number(5, 7, 1)[0], 5)
self.assertEqual(self.generator.generate_number(5, 7, 1)[0], 6)
self.assertEqual(self.generator.generate_number(5, 7, 1)[0], 7)
self.assertEqual(self.generator.generate_number(5, 7, 1)[0], 5)
def test_change_repeat(self):
"""반복 횟수 변경 테스트"""
# 처음에 반복 1회 사용
self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 1)
self.assertEqual(self.generator.generate_number(1, 3, 1)[0], 2)
# 반복 횟수를 2회로 변경
# 현재 숫자는 3이고, 반복 횟수는 1이므로 3이 한 번 더 출력되어야 함
self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 3)
self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 3)
# 다음 숫자인 1이 2번 반복되어야 함
self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 1)
self.assertEqual(self.generator.generate_number(1, 3, 2)[0], 1)
if __name__ == '__main__':
unittest.main()