diff --git a/nhn/views.py b/nhn/views.py index 40d7e78..f091ae3 100644 --- a/nhn/views.py +++ b/nhn/views.py @@ -70,6 +70,18 @@ from .packages.base import NHNCloudAPIError logger = logging.getLogger(__name__) +# ==================== Base View ==================== + + +class NHNBaseView(APIView): + """ + NHN Cloud API 베이스 뷰 + Kong이 이미 JWT 인증을 수행하므로 Django에서는 인증을 건너뜀 + """ + authentication_classes = [] + permission_classes = [AllowAny] + + # ==================== Common Headers ==================== region_header = openapi.Parameter( @@ -114,12 +126,9 @@ def get_nhn_headers(request): # ==================== Token API ==================== -class TokenCreateView(APIView): +class TokenCreateView(NHNBaseView): """토큰 생성 API""" - authentication_classes = [] # 인증 완전히 건너뜀 - permission_classes = [AllowAny] - @swagger_auto_schema( operation_summary="NHN Cloud API 토큰 생성", operation_description="NHN Cloud API 인증 토큰을 생성합니다.", @@ -172,7 +181,7 @@ class TokenCreateView(APIView): # ==================== Compute API ==================== -class ComputeFlavorListView(APIView): +class ComputeFlavorListView(NHNBaseView): """Flavor 목록 조회 API""" @swagger_auto_schema( @@ -189,7 +198,7 @@ class ComputeFlavorListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class ComputeKeypairListView(APIView): +class ComputeKeypairListView(NHNBaseView): """Keypair 목록 조회 API""" @swagger_auto_schema( @@ -206,7 +215,7 @@ class ComputeKeypairListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class ComputeImageListView(APIView): +class ComputeImageListView(NHNBaseView): """이미지 목록 조회 API""" @swagger_auto_schema( @@ -223,7 +232,7 @@ class ComputeImageListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class ComputeInstanceListView(APIView): +class ComputeInstanceListView(NHNBaseView): """인스턴스 목록 조회 API""" @swagger_auto_schema( @@ -243,7 +252,7 @@ class ComputeInstanceListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class ComputeInstanceDetailView(APIView): +class ComputeInstanceDetailView(NHNBaseView): """인스턴스 상세/삭제 API""" @swagger_auto_schema( @@ -285,7 +294,7 @@ class ComputeInstanceDetailView(APIView): return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) -class ComputeInstanceCreateView(APIView): +class ComputeInstanceCreateView(NHNBaseView): """인스턴스 생성 API (비동기)""" @swagger_auto_schema( @@ -324,7 +333,7 @@ class ComputeInstanceCreateView(APIView): return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) -class ComputeInstanceActionView(APIView): +class ComputeInstanceActionView(NHNBaseView): """인스턴스 액션 API (시작/정지/재부팅) - 비동기""" @swagger_auto_schema( @@ -377,7 +386,7 @@ class ComputeInstanceActionView(APIView): # ==================== VPC API ==================== -class VpcListView(APIView): +class VpcListView(NHNBaseView): """VPC 목록 조회 API""" @swagger_auto_schema( @@ -399,7 +408,7 @@ class VpcListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class VpcCreateView(APIView): +class VpcCreateView(NHNBaseView): """VPC 생성 API (비동기)""" @swagger_auto_schema( @@ -432,7 +441,7 @@ class VpcCreateView(APIView): return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) -class VpcDetailView(APIView): +class VpcDetailView(NHNBaseView): """VPC 상세/삭제 API""" @swagger_auto_schema( @@ -480,7 +489,7 @@ class VpcDetailView(APIView): return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) -class SubnetListView(APIView): +class SubnetListView(NHNBaseView): """서브넷 목록 조회 API""" @swagger_auto_schema( @@ -497,7 +506,7 @@ class SubnetListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class SubnetCreateView(APIView): +class SubnetCreateView(NHNBaseView): """서브넷 생성 API (비동기)""" @swagger_auto_schema( @@ -531,7 +540,7 @@ class SubnetCreateView(APIView): return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) -class SubnetDetailView(APIView): +class SubnetDetailView(NHNBaseView): """서브넷 상세/삭제 API""" @swagger_auto_schema( @@ -572,7 +581,7 @@ class SubnetDetailView(APIView): return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) -class FloatingIpListView(APIView): +class FloatingIpListView(NHNBaseView): """Floating IP 목록 조회 API""" @swagger_auto_schema( @@ -592,7 +601,7 @@ class FloatingIpListView(APIView): # ==================== Security Group API ==================== -class SecurityGroupListView(APIView): +class SecurityGroupListView(NHNBaseView): """보안 그룹 목록 조회 API""" @swagger_auto_schema( @@ -612,7 +621,7 @@ class SecurityGroupListView(APIView): # ==================== Async Task API ==================== -class AsyncTaskListView(APIView): +class AsyncTaskListView(NHNBaseView): """비동기 작업 목록 조회 API""" @swagger_auto_schema( @@ -640,7 +649,7 @@ class AsyncTaskListView(APIView): return Response({"tasks": data}) -class AsyncTaskDetailView(APIView): +class AsyncTaskDetailView(NHNBaseView): """비동기 작업 상세 조회 API""" @swagger_auto_schema( @@ -674,7 +683,7 @@ class AsyncTaskDetailView(APIView): # ==================== NKS API ==================== -class NksSupportsView(APIView): +class NksSupportsView(NHNBaseView): """NKS 지원 버전 및 작업 종류 조회 API""" @swagger_auto_schema( @@ -691,7 +700,7 @@ class NksSupportsView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksClusterListView(APIView): +class NksClusterListView(NHNBaseView): """NKS 클러스터 목록 조회 API""" @swagger_auto_schema( @@ -708,7 +717,7 @@ class NksClusterListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksClusterDetailView(APIView): +class NksClusterDetailView(NHNBaseView): """NKS 클러스터 상세/삭제 API""" @swagger_auto_schema( @@ -748,7 +757,7 @@ class NksClusterDetailView(APIView): return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) -class NksClusterConfigView(APIView): +class NksClusterConfigView(NHNBaseView): """NKS 클러스터 kubeconfig 조회 API""" @swagger_auto_schema( @@ -766,7 +775,7 @@ class NksClusterConfigView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksClusterCreateView(APIView): +class NksClusterCreateView(NHNBaseView): """NKS 클러스터 생성 API (비동기)""" @swagger_auto_schema( @@ -834,7 +843,7 @@ class NksClusterCreateView(APIView): return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) -class NksClusterResizeView(APIView): +class NksClusterResizeView(NHNBaseView): """NKS 클러스터 리사이즈 API""" @swagger_auto_schema( @@ -857,7 +866,7 @@ class NksClusterResizeView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksClusterUpgradeView(APIView): +class NksClusterUpgradeView(NHNBaseView): """NKS 클러스터 업그레이드 API""" @swagger_auto_schema( @@ -880,7 +889,7 @@ class NksClusterUpgradeView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksClusterEventsView(APIView): +class NksClusterEventsView(NHNBaseView): """NKS 클러스터 작업 이력 API""" @swagger_auto_schema( @@ -897,7 +906,7 @@ class NksClusterEventsView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksClusterEventDetailView(APIView): +class NksClusterEventDetailView(NHNBaseView): """NKS 클러스터 작업 이력 상세 API""" @swagger_auto_schema( @@ -914,7 +923,7 @@ class NksClusterEventDetailView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksClusterCertificatesView(APIView): +class NksClusterCertificatesView(NHNBaseView): """NKS 클러스터 인증서 갱신 API""" @swagger_auto_schema( @@ -932,7 +941,7 @@ class NksClusterCertificatesView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksClusterIpAclView(APIView): +class NksClusterIpAclView(NHNBaseView): """NKS 클러스터 API 엔드포인트 IP 접근 제어 API""" @swagger_auto_schema( @@ -975,7 +984,7 @@ class NksClusterIpAclView(APIView): # ==================== NKS Node Group API ==================== -class NksNodeGroupListView(APIView): +class NksNodeGroupListView(NHNBaseView): """NKS 노드 그룹 목록 조회 API""" @swagger_auto_schema( @@ -992,7 +1001,7 @@ class NksNodeGroupListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksNodeGroupCreateView(APIView): +class NksNodeGroupCreateView(NHNBaseView): """NKS 노드 그룹 생성 API""" @swagger_auto_schema( @@ -1023,7 +1032,7 @@ class NksNodeGroupCreateView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksNodeGroupDetailView(APIView): +class NksNodeGroupDetailView(NHNBaseView): """NKS 노드 그룹 상세/삭제/수정 API""" @swagger_auto_schema( @@ -1078,7 +1087,7 @@ class NksNodeGroupDetailView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksNodeGroupUpgradeView(APIView): +class NksNodeGroupUpgradeView(NHNBaseView): """NKS 노드 그룹 업그레이드 API""" @swagger_auto_schema( @@ -1106,7 +1115,7 @@ class NksNodeGroupUpgradeView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksNodeGroupUserScriptView(APIView): +class NksNodeGroupUserScriptView(NHNBaseView): """NKS 노드 그룹 사용자 스크립트 API""" @swagger_auto_schema( @@ -1133,7 +1142,7 @@ class NksNodeGroupUserScriptView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksNodeStartView(APIView): +class NksNodeStartView(NHNBaseView): """NKS 워커 노드 시작 API""" @swagger_auto_schema( @@ -1160,7 +1169,7 @@ class NksNodeStartView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksNodeStopView(APIView): +class NksNodeStopView(NHNBaseView): """NKS 워커 노드 중지 API""" @swagger_auto_schema( @@ -1187,7 +1196,7 @@ class NksNodeStopView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class NksAutoscaleConfigView(APIView): +class NksAutoscaleConfigView(NHNBaseView): """NKS 오토스케일러 설정 API""" @swagger_auto_schema( @@ -1243,7 +1252,7 @@ storage_account_header = openapi.Parameter( ) -class StorageContainerListView(APIView): +class StorageContainerListView(NHNBaseView): """스토리지 컨테이너 목록 조회 API""" @swagger_auto_schema( @@ -1263,7 +1272,7 @@ class StorageContainerListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class StorageContainerCreateView(APIView): +class StorageContainerCreateView(NHNBaseView): """스토리지 컨테이너 생성 API (비동기)""" @swagger_auto_schema( @@ -1296,7 +1305,7 @@ class StorageContainerCreateView(APIView): return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) -class StorageContainerDetailView(APIView): +class StorageContainerDetailView(NHNBaseView): """스토리지 컨테이너 상세/삭제 API""" @swagger_auto_schema( @@ -1362,7 +1371,7 @@ def get_appkey(request): # ==================== DNS Zone API ==================== -class DnsZoneListView(APIView): +class DnsZoneListView(NHNBaseView): """DNS Zone 목록 조회 API""" @swagger_auto_schema( @@ -1386,7 +1395,7 @@ class DnsZoneListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class DnsZoneCreateView(APIView): +class DnsZoneCreateView(NHNBaseView): """DNS Zone 생성 API""" @swagger_auto_schema( @@ -1412,7 +1421,7 @@ class DnsZoneCreateView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class DnsZoneDetailView(APIView): +class DnsZoneDetailView(NHNBaseView): """DNS Zone 상세/수정/삭제 API""" @swagger_auto_schema( @@ -1465,7 +1474,7 @@ class DnsZoneDetailView(APIView): # ==================== DNS Record Set API ==================== -class DnsRecordSetListView(APIView): +class DnsRecordSetListView(NHNBaseView): """DNS 레코드 세트 목록 조회 API""" @swagger_auto_schema( @@ -1492,7 +1501,7 @@ class DnsRecordSetListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class DnsRecordSetCreateView(APIView): +class DnsRecordSetCreateView(NHNBaseView): """DNS 레코드 세트 생성 API""" @swagger_auto_schema( @@ -1521,7 +1530,7 @@ class DnsRecordSetCreateView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class DnsRecordSetDetailView(APIView): +class DnsRecordSetDetailView(NHNBaseView): """DNS 레코드 세트 상세/수정/삭제 API""" @swagger_auto_schema( @@ -1580,7 +1589,7 @@ class DnsRecordSetDetailView(APIView): # ==================== DNS Pool API ==================== -class DnsPoolListView(APIView): +class DnsPoolListView(NHNBaseView): """DNS Pool 목록 조회 API""" @swagger_auto_schema( @@ -1604,7 +1613,7 @@ class DnsPoolListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class DnsPoolCreateView(APIView): +class DnsPoolCreateView(NHNBaseView): """DNS Pool 생성 API""" @swagger_auto_schema( @@ -1632,7 +1641,7 @@ class DnsPoolCreateView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class DnsPoolDetailView(APIView): +class DnsPoolDetailView(NHNBaseView): """DNS Pool 상세/수정/삭제 API""" @swagger_auto_schema( @@ -1691,7 +1700,7 @@ class DnsPoolDetailView(APIView): # ==================== DNS GSLB API ==================== -class DnsGslbListView(APIView): +class DnsGslbListView(NHNBaseView): """DNS GSLB 목록 조회 API""" @swagger_auto_schema( @@ -1715,7 +1724,7 @@ class DnsGslbListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class DnsGslbCreateView(APIView): +class DnsGslbCreateView(NHNBaseView): """DNS GSLB 생성 API""" @swagger_auto_schema( @@ -1744,7 +1753,7 @@ class DnsGslbCreateView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class DnsGslbDetailView(APIView): +class DnsGslbDetailView(NHNBaseView): """DNS GSLB 상세/수정/삭제 API""" @swagger_auto_schema( @@ -1801,7 +1810,7 @@ class DnsGslbDetailView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class DnsGslbPoolConnectView(APIView): +class DnsGslbPoolConnectView(NHNBaseView): """GSLB에 Pool 연결/수정/해제 API""" @swagger_auto_schema( @@ -1870,7 +1879,7 @@ class DnsGslbPoolConnectView(APIView): # ==================== DNS Health Check API ==================== -class DnsHealthCheckListView(APIView): +class DnsHealthCheckListView(NHNBaseView): """DNS Health Check 목록 조회 API""" @swagger_auto_schema( @@ -1894,7 +1903,7 @@ class DnsHealthCheckListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class DnsHealthCheckCreateView(APIView): +class DnsHealthCheckCreateView(NHNBaseView): """DNS Health Check 생성 API""" @swagger_auto_schema( @@ -1927,7 +1936,7 @@ class DnsHealthCheckCreateView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class DnsHealthCheckDetailView(APIView): +class DnsHealthCheckDetailView(NHNBaseView): """DNS Health Check 상세/수정/삭제 API""" @swagger_auto_schema( @@ -1991,7 +2000,7 @@ class DnsHealthCheckDetailView(APIView): # ==================== Load Balancer API ==================== -class LoadBalancerListView(APIView): +class LoadBalancerListView(NHNBaseView): """로드밸런서 목록 조회 API""" @swagger_auto_schema( @@ -2017,7 +2026,7 @@ class LoadBalancerListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class LoadBalancerCreateView(APIView): +class LoadBalancerCreateView(NHNBaseView): """로드밸런서 생성 API (비동기)""" @swagger_auto_schema( @@ -2049,7 +2058,7 @@ class LoadBalancerCreateView(APIView): return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) -class LoadBalancerDetailView(APIView): +class LoadBalancerDetailView(NHNBaseView): """로드밸런서 상세/수정/삭제 API""" @swagger_auto_schema( @@ -2123,7 +2132,7 @@ class LoadBalancerDetailView(APIView): # ==================== LB Listener API ==================== -class LBListenerListView(APIView): +class LBListenerListView(NHNBaseView): """리스너 목록 조회 API""" @swagger_auto_schema( @@ -2144,7 +2153,7 @@ class LBListenerListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class LBListenerCreateView(APIView): +class LBListenerCreateView(NHNBaseView): """리스너 생성 API""" @swagger_auto_schema( @@ -2178,7 +2187,7 @@ class LBListenerCreateView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class LBListenerDetailView(APIView): +class LBListenerDetailView(NHNBaseView): """리스너 상세/수정/삭제 API""" @swagger_auto_schema( @@ -2239,7 +2248,7 @@ class LBListenerDetailView(APIView): # ==================== LB Pool API ==================== -class LBPoolListView(APIView): +class LBPoolListView(NHNBaseView): """풀 목록 조회 API""" @swagger_auto_schema( @@ -2261,7 +2270,7 @@ class LBPoolListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class LBPoolCreateView(APIView): +class LBPoolCreateView(NHNBaseView): """풀 생성 API""" @swagger_auto_schema( @@ -2293,7 +2302,7 @@ class LBPoolCreateView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class LBPoolDetailView(APIView): +class LBPoolDetailView(NHNBaseView): """풀 상세/수정/삭제 API""" @swagger_auto_schema( @@ -2353,7 +2362,7 @@ class LBPoolDetailView(APIView): # ==================== LB Member API ==================== -class LBMemberListView(APIView): +class LBMemberListView(NHNBaseView): """멤버 목록 조회 API""" @swagger_auto_schema( @@ -2370,7 +2379,7 @@ class LBMemberListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class LBMemberCreateView(APIView): +class LBMemberCreateView(NHNBaseView): """멤버 추가 API""" @swagger_auto_schema( @@ -2400,7 +2409,7 @@ class LBMemberCreateView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class LBMemberDetailView(APIView): +class LBMemberDetailView(NHNBaseView): """멤버 상세/수정/삭제 API""" @swagger_auto_schema( @@ -2458,7 +2467,7 @@ class LBMemberDetailView(APIView): # ==================== LB Health Monitor API ==================== -class LBHealthMonitorListView(APIView): +class LBHealthMonitorListView(NHNBaseView): """헬스 모니터 목록 조회 API""" @swagger_auto_schema( @@ -2478,7 +2487,7 @@ class LBHealthMonitorListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class LBHealthMonitorCreateView(APIView): +class LBHealthMonitorCreateView(NHNBaseView): """헬스 모니터 생성 API""" @swagger_auto_schema( @@ -2513,7 +2522,7 @@ class LBHealthMonitorCreateView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class LBHealthMonitorDetailView(APIView): +class LBHealthMonitorDetailView(NHNBaseView): """헬스 모니터 상세/수정/삭제 API""" @swagger_auto_schema( @@ -2801,7 +2810,7 @@ class LBL7RuleDetailView(APIView): # ==================== LB IP ACL Group API ==================== -class LBIpAclGroupListView(APIView): +class LBIpAclGroupListView(NHNBaseView): """IP ACL 그룹 목록 조회 API""" @swagger_auto_schema( @@ -2818,7 +2827,7 @@ class LBIpAclGroupListView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class LBIpAclGroupCreateView(APIView): +class LBIpAclGroupCreateView(NHNBaseView): """IP ACL 그룹 생성 API""" @swagger_auto_schema( @@ -2847,7 +2856,7 @@ class LBIpAclGroupCreateView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class LBIpAclGroupDetailView(APIView): +class LBIpAclGroupDetailView(NHNBaseView): """IP ACL 그룹 상세/수정/삭제 API""" @swagger_auto_schema( @@ -2905,7 +2914,7 @@ class LBIpAclGroupDetailView(APIView): # ==================== LB IP ACL Target API ==================== -class LBIpAclTargetCreateView(APIView): +class LBIpAclTargetCreateView(NHNBaseView): """IP ACL 타깃 추가 API""" @swagger_auto_schema( @@ -2932,7 +2941,7 @@ class LBIpAclTargetCreateView(APIView): return Response({"error": e.message}, status=status.HTTP_400_BAD_REQUEST) -class LBIpAclTargetDetailView(APIView): +class LBIpAclTargetDetailView(NHNBaseView): """IP ACL 타깃 수정/삭제 API""" @swagger_auto_schema( @@ -2978,7 +2987,7 @@ class LBIpAclTargetDetailView(APIView): # ==================== LB Quota API ==================== -class LBQuotaView(APIView): +class LBQuotaView(NHNBaseView): """로드밸런서 쿼타 조회 API""" @swagger_auto_schema( diff --git a/version b/version index b52cc10..71ad83c 100644 --- a/version +++ b/version @@ -1 +1 @@ -v0.0.12 \ No newline at end of file +v0.0.13 \ No newline at end of file