TEMPLATE MANAGER
쿠버네티스처럼 YAML 파일로 이루어진 템플릿을 쉽게 관리하고, 템플릿의 타입에 따라 다르게 처리해주는 패키지입니다.
📝 Table of Contents
🧐 About
쿠버네티스처럼 YAML 파일로 이루어진 템플릿을 쉽게 관리하고, 템플릿의 타입에 따라 다르게 처리해주는 패키지입니다.
가장 간단한 예시를 들어보겠습니다.
-
어딘가에서 1 + 2, 3 + 5 의 결과와 "Hello World" 라는 문장의 첫 단어를 가져오고 싶다고 해봅시다.
-
그렇다면 템플릿 타입(kind)는 plus 와 first_word_getter 가 필요합니다.
-
템플릿은 아래와 같이 만들 수 있습니다.
kind: plus name: one_plus_two spec: number_a: 1 number_b: 2
kind: plus name: three_plus_five spec: number_a: 3 number_b: 5
kind: first_word_getter name: any_name spec: default_sentence: "Hello World"
-
이제 개발자는 템플릿 타입인
plus
와first_word_getter
를 처리하는 함수를 만듭니다. -
이제 어딘가에서 템플릿의
name
또는tags
,category
,meta
등으로 템플릿을 검색해서 그에 맞는 처리를 해달라고 요청을 할 수 있습니다.- 요청을 할 때 사용자 매개변수를 받아서 처리 할 수도 있습니다.
-
name
으로one_plus_two
인 템플릿을 찾아서 처리해달라고 요청했다고 가정해봅시다. -
이제 프로그램은 아래의 스텝을 따라서 처리합니다.
-
템플릿 목록에서
name
이one_plus_two
인 템플릿을 찾는다. -
kind
에 따라서 처리하는데, 여기에서는kind
가plus
이므로 사용자가 만든plus
처리 함수를 호출해서 결과값을 받아온다. -
받은 결과값을 요청자에게 돌려준다.
-
-
요청자는 결과값을 받을 수 있게 됩니다. 자세한 내용은 아래를 참조하세요.
🏁 Getting Started
Installing
pip install template_manager
🌱 Tutorial
-
YAML 템플릿들을 저장할 폴더를 생성해야합니다. 원하는 곳에
templates
폴더를 생성하세요. -
YAML 파일을 아래와 같이 생성하세요.
-
templates
폴더 안에 파일을 recursive 하게 돌면서 파일을 찾아내기 때문에 깊숙한 곳에 넣어두어도 상관 없습니다. - 파일명은 어떤 것으로 해도 상관 없습니다.
your_templates_directory/첫번째 파일.yaml
kind: plus name: one_plus_two spec: number_a: 1 number_b: 2 --- kind: plus name: three_plus_five spec: number_a: 3 number_b: 5
your_templates_directory/두번째 파일.yaml
kind: first_word_getter meta: getter: True order: first spec: default_sentence: "Hello World"
-
-
아래의 코드를 실행하세요.
from pprint import pprint import template_manager handler = template_manager.YAMLTemplate("your_templates_directory/") pprint(handler.get("one_plus_two"))
결과는 다음과 같습니다.
{'category': 'default', 'kind': 'plus', 'meta': {}, 'name': 'one_plus_two', 'origin': {'category': 'default', 'kind': 'plus', 'meta': {}, 'name': 'one_plus_two', 'spec': {'number_a': 1, 'number_b': 2}, 'tags': []}, 'path': 'templates/first_word_getter_list.yaml', 'random_name': False, 'tags': []}
-
plus
를 처리하기 위해서 등록을 하고 처리 요청을 하는 아래의 코드를 실행하세요.# worker 는 반드시 spec 과 args 매개변수를 받아야 합니다. # spec 은 템플릿에서 spec 키의 값들입니다. # args 는 유저가 보내는 파라미터입니다. handler.register("plus", lambda spec, args: spec["number_a"] + spec["number_b"]) print(handler.process("one_plus_two")) print(handler.process("three_plus_five"))
결과는 다음과 같습니다.
3 8
-
아까 만든 템플릿 중 하나는
name
키가 없는 아래와 같은 형식이었습니다. 이 템플릿을 불러와서 처리해보겠습니다.kind: first_word_getter meta: getter: True order: first spec: default_sentence: "Hello World"
# first_word_getter 를 처리 할 함수를 생성하고 등록합니다. def first_word_getter_worker(spec, args): sentence = spec["default_sentence"] if "sentence" in args: sentence = args["sentence"] return sentence.split(" ")[0] handler.register("first_word_getter", first_word_getter_worker) # meta 에서 "order" 키가 있는 모든 템플릿 중에서 값이 "first" 인 템플릿 이름을 전부 가져옵니다. found_template_name_list = handler.find(kind="first_word_getter", meta={ "order": "first", }) print("name: ", found_template_name_list[0]) print(handler.process(found_template_name_list[0])) print(handler.process(found_template_name_list[0], {"sentence": "Yellow Monkey"}))
결과는 다음과 같습니다.
-
name
을 지정하지 않았기 때문에 랜덤으로 생성되었습니다.
name: dGVtcGxhdGVzL3BsdXNfbGlzdC55YW1sMA== Hello Yellow
-
-
튜토리얼이 끝났습니다.
🎈 Usage
🌱 register
템플릿을 처리할 방식을 등록 할 때 사용합니다.
Parameters
-
(required) kind
: str템플릿 타입 이름입니다.
-
(required) worker
: function이 타입을 처리해주는 함수입니다.
spec
과args
매개변수를 반드시 받아야 합니다.-
spec
: spec key in YAML -
args
: 유저가 보내는 매개변수
def worker(spec, args): ...
-
-
template_schema
: dict템플릿에 사용하는 스키마입니다. 자세한 내용은 여기 를 참조하세요.
{ "plus": { "schema": { "type": "object", "properties": { "number_a": {}, "number_b": {} }, "required": [ "number_a", "number_b" ] } } }
-
process_schema
: dictProcess 함수가 사용하는 스키마입니다. 자세한 내용은 여기 를 참조하세요.
{ "first_word_getter": { "schema": { "type": "object", "properties": { "sentence": {} } }, "properties": { "sentence": { "default": "Hello World" } } } }
-
(deprecated) options
: dict패키지가 경량화되며 deprecated 되었습니다.
Returns
오류가 없다면 항상 True 를 반환합니다.
🌱 get
템플릿의 정보를 가져올 때 사용합니다.
Parameters
-
(required) name
: str템플릿의 이름입니다.
Returns
템플릿 정보
: dict
🌱 find
템플릿들을 찾을 때 사용합니다.
Parameters
-
kind
: strkind 로 템플릿들을 찾습니다.
"plus"
-
category
: strcategory 로 템플릿들을 찾습니다.
"fruit"
-
tags
: listtags 로 템플릿들을 찾습니다.
요청한 태그들이 모두 매치되어야 합니다.
["apple", "banana"]
-
meta
: dictmeta 로 템플릿들을 찾습니다.
tags 가 배열이라면 meta 는 dict 형식입니다.
{ "fruit": "apple" }
Returns
template name list
: list
🌱 process
Register 에서 등록한 방식대로 템플릿을 처리 할 때 사용합니다.
Parameters
-
(required) name
: str템플릿의 이름입니다.
-
(required) args
: dictWorker 에게 보낼 매개변수입니다.
Returns
Wokrer 가 처리한 결과
Reference
🌱 스키마를 사용하는 방법 (#how_to_use_schmea)
{
// schema 에 사용하는 값에 대해 자세하게 알고싶다면 https://json-schema.org/ 를 참조하세요.
"schema": {
"properties": {
"number_a": {
"type": "integer"
},
"number_b_list": {
"type": "array"
},
"name": {}
},
// 반드시 필요한 매개변수는 여기에 추가하세요.
"required": [
"number_a",
"number_b_list"
]
},
// 이 부분은 위에서 정한 스키마의 속성의 기본값을 정하는 등의 json schema 라이브러리가 하지 못하는 역할을 보조합니다.
"properties": {
"name": {
"default": "hello"
}
}
}