handsbot-maestro-sdk 0.1.0__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.
@@ -0,0 +1,5 @@
1
+ Copyright © 2026 4HandsBot. Todos os direitos reservados.
2
+
3
+ O uso deste SDK é permitido exclusivamente por clientes autorizados,
4
+ em conjunto com os serviços da plataforma. É proibida a redistribuição,
5
+ publicação, sublicenciamento ou utilização fora dessa finalidade.
@@ -0,0 +1,118 @@
1
+ Metadata-Version: 2.4
2
+ Name: handsbot-maestro-sdk
3
+ Version: 0.1.0
4
+ Summary: SDK Python para criação de tarefas no Maestro (4HandsBot)
5
+ Project-URL: Homepage, https://github.com/fourhandsbot/maestro
6
+ Project-URL: Bug Tracker, https://github.com/fourhandsbot/maestro/issues
7
+ Keywords: maestro,handsbot,automation,rpa,sdk
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.9
10
+ Classifier: Programming Language :: Python :: 3.10
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: License :: Other/Proprietary License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
17
+ Requires-Python: >=3.9
18
+ Description-Content-Type: text/markdown
19
+ License-File: LICENSE
20
+ Requires-Dist: requests>=2.31.0
21
+ Dynamic: license-file
22
+
23
+ # handsbot-maestro-sdk
24
+
25
+ SDK Python para criar e enfileirar tarefas de automação no **Maestro** (4HandsBot).
26
+
27
+ ## Instalação
28
+
29
+ ```bash
30
+ pip install handsbot-maestro-sdk
31
+ ```
32
+
33
+ ## Uso rápido
34
+
35
+ ```python
36
+ from maestro import MaestroSDK
37
+
38
+ sdk = MaestroSDK(
39
+ api_url="https://empresa.com.br/api/v1",
40
+ workspace="",
41
+ login="",
42
+ keypass="",
43
+ )
44
+
45
+ task = sdk.create_task(
46
+ label="minha_automacao",
47
+ parameters=[
48
+ {"label": "destinatario", "value": "admin@empresa.com"},
49
+ ],
50
+ )
51
+
52
+ print(task.uuid, task.status)
53
+ ```
54
+
55
+ ## Configuração
56
+
57
+ As credenciais podem ser passadas de duas formas (argumentos têm precedência):
58
+
59
+ ### Via variáveis de ambiente
60
+
61
+ ```bash
62
+ export MAESTRO_API_URL=http://localhost:3001/api/v1
63
+ export MAESTRO_WORKSPACE=dev
64
+ export MAESTRO_LOGIN=empresa
65
+ export MAESTRO_KEYPASS=pass
66
+ ```
67
+
68
+ ```python
69
+ sdk = MaestroSDK() # lê as variáveis automaticamente
70
+ ```
71
+
72
+ ### Via argumentos do construtor
73
+
74
+ ```python
75
+ sdk = MaestroSDK(
76
+ api_url="https://empresa.com.br/api/v1",
77
+ workspace="dev",
78
+ login="empresa",
79
+ keypass="pass",
80
+ )
81
+ ```
82
+
83
+ ## `create_task`
84
+
85
+ ```python
86
+ task = sdk.create_task(
87
+ label="nome_da_automacao", # obrigatório — label cadastrado no Maestro
88
+ parameters=[ # opcional
89
+ {"label": "param1", "value": "valor1"},
90
+ ],
91
+ priority=1, # opcional, padrão 1
92
+ min_execution_date=datetime(...), # opcional — executa somente após esse momento
93
+ )
94
+ ```
95
+
96
+ | Parâmetro | Tipo | Descrição |
97
+ | -------------------- | ------------ | ------------------------------------------------- |
98
+ | `label` | `str` | Label da automação cadastrada no Maestro |
99
+ | `parameters` | `list[dict]` | Lista de `{"label": ..., "value": ...}` |
100
+ | `priority` | `int` | Prioridade da tarefa (padrão: `1`) |
101
+ | `min_execution_date` | `datetime` | Data/hora mínima para o runner iniciar a execução |
102
+
103
+ ## Exceções
104
+
105
+ | Exceção | Quando |
106
+ | ------------------------ | -------------------------------------------------- |
107
+ | `MaestroConfigError` | Credenciais ausentes na inicialização |
108
+ | `MaestroAuthError` | Credenciais inválidas ou token expirado |
109
+ | `MaestroConnectionError` | Falha de rede ou `requests` não instalado |
110
+ | `MaestroError` | Automação não encontrada, parâmetro inválido, etc. |
111
+
112
+ ## Licença
113
+
114
+ Copyright © 2026 4HandsBot. Todos os direitos reservados.
115
+
116
+ O uso deste SDK é permitido exclusivamente por clientes autorizados,
117
+ em conjunto com os serviços da plataforma. É proibida a redistribuição,
118
+ publicação, sublicenciamento ou utilização fora dessa finalidade.
@@ -0,0 +1,96 @@
1
+ # handsbot-maestro-sdk
2
+
3
+ SDK Python para criar e enfileirar tarefas de automação no **Maestro** (4HandsBot).
4
+
5
+ ## Instalação
6
+
7
+ ```bash
8
+ pip install handsbot-maestro-sdk
9
+ ```
10
+
11
+ ## Uso rápido
12
+
13
+ ```python
14
+ from maestro import MaestroSDK
15
+
16
+ sdk = MaestroSDK(
17
+ api_url="https://empresa.com.br/api/v1",
18
+ workspace="",
19
+ login="",
20
+ keypass="",
21
+ )
22
+
23
+ task = sdk.create_task(
24
+ label="minha_automacao",
25
+ parameters=[
26
+ {"label": "destinatario", "value": "admin@empresa.com"},
27
+ ],
28
+ )
29
+
30
+ print(task.uuid, task.status)
31
+ ```
32
+
33
+ ## Configuração
34
+
35
+ As credenciais podem ser passadas de duas formas (argumentos têm precedência):
36
+
37
+ ### Via variáveis de ambiente
38
+
39
+ ```bash
40
+ export MAESTRO_API_URL=http://localhost:3001/api/v1
41
+ export MAESTRO_WORKSPACE=dev
42
+ export MAESTRO_LOGIN=empresa
43
+ export MAESTRO_KEYPASS=pass
44
+ ```
45
+
46
+ ```python
47
+ sdk = MaestroSDK() # lê as variáveis automaticamente
48
+ ```
49
+
50
+ ### Via argumentos do construtor
51
+
52
+ ```python
53
+ sdk = MaestroSDK(
54
+ api_url="https://empresa.com.br/api/v1",
55
+ workspace="dev",
56
+ login="empresa",
57
+ keypass="pass",
58
+ )
59
+ ```
60
+
61
+ ## `create_task`
62
+
63
+ ```python
64
+ task = sdk.create_task(
65
+ label="nome_da_automacao", # obrigatório — label cadastrado no Maestro
66
+ parameters=[ # opcional
67
+ {"label": "param1", "value": "valor1"},
68
+ ],
69
+ priority=1, # opcional, padrão 1
70
+ min_execution_date=datetime(...), # opcional — executa somente após esse momento
71
+ )
72
+ ```
73
+
74
+ | Parâmetro | Tipo | Descrição |
75
+ | -------------------- | ------------ | ------------------------------------------------- |
76
+ | `label` | `str` | Label da automação cadastrada no Maestro |
77
+ | `parameters` | `list[dict]` | Lista de `{"label": ..., "value": ...}` |
78
+ | `priority` | `int` | Prioridade da tarefa (padrão: `1`) |
79
+ | `min_execution_date` | `datetime` | Data/hora mínima para o runner iniciar a execução |
80
+
81
+ ## Exceções
82
+
83
+ | Exceção | Quando |
84
+ | ------------------------ | -------------------------------------------------- |
85
+ | `MaestroConfigError` | Credenciais ausentes na inicialização |
86
+ | `MaestroAuthError` | Credenciais inválidas ou token expirado |
87
+ | `MaestroConnectionError` | Falha de rede ou `requests` não instalado |
88
+ | `MaestroError` | Automação não encontrada, parâmetro inválido, etc. |
89
+
90
+ ## Licença
91
+
92
+ Copyright © 2026 4HandsBot. Todos os direitos reservados.
93
+
94
+ O uso deste SDK é permitido exclusivamente por clientes autorizados,
95
+ em conjunto com os serviços da plataforma. É proibida a redistribuição,
96
+ publicação, sublicenciamento ou utilização fora dessa finalidade.
@@ -0,0 +1,118 @@
1
+ Metadata-Version: 2.4
2
+ Name: handsbot-maestro-sdk
3
+ Version: 0.1.0
4
+ Summary: SDK Python para criação de tarefas no Maestro (4HandsBot)
5
+ Project-URL: Homepage, https://github.com/fourhandsbot/maestro
6
+ Project-URL: Bug Tracker, https://github.com/fourhandsbot/maestro/issues
7
+ Keywords: maestro,handsbot,automation,rpa,sdk
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.9
10
+ Classifier: Programming Language :: Python :: 3.10
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: License :: Other/Proprietary License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
17
+ Requires-Python: >=3.9
18
+ Description-Content-Type: text/markdown
19
+ License-File: LICENSE
20
+ Requires-Dist: requests>=2.31.0
21
+ Dynamic: license-file
22
+
23
+ # handsbot-maestro-sdk
24
+
25
+ SDK Python para criar e enfileirar tarefas de automação no **Maestro** (4HandsBot).
26
+
27
+ ## Instalação
28
+
29
+ ```bash
30
+ pip install handsbot-maestro-sdk
31
+ ```
32
+
33
+ ## Uso rápido
34
+
35
+ ```python
36
+ from maestro import MaestroSDK
37
+
38
+ sdk = MaestroSDK(
39
+ api_url="https://empresa.com.br/api/v1",
40
+ workspace="",
41
+ login="",
42
+ keypass="",
43
+ )
44
+
45
+ task = sdk.create_task(
46
+ label="minha_automacao",
47
+ parameters=[
48
+ {"label": "destinatario", "value": "admin@empresa.com"},
49
+ ],
50
+ )
51
+
52
+ print(task.uuid, task.status)
53
+ ```
54
+
55
+ ## Configuração
56
+
57
+ As credenciais podem ser passadas de duas formas (argumentos têm precedência):
58
+
59
+ ### Via variáveis de ambiente
60
+
61
+ ```bash
62
+ export MAESTRO_API_URL=http://localhost:3001/api/v1
63
+ export MAESTRO_WORKSPACE=dev
64
+ export MAESTRO_LOGIN=empresa
65
+ export MAESTRO_KEYPASS=pass
66
+ ```
67
+
68
+ ```python
69
+ sdk = MaestroSDK() # lê as variáveis automaticamente
70
+ ```
71
+
72
+ ### Via argumentos do construtor
73
+
74
+ ```python
75
+ sdk = MaestroSDK(
76
+ api_url="https://empresa.com.br/api/v1",
77
+ workspace="dev",
78
+ login="empresa",
79
+ keypass="pass",
80
+ )
81
+ ```
82
+
83
+ ## `create_task`
84
+
85
+ ```python
86
+ task = sdk.create_task(
87
+ label="nome_da_automacao", # obrigatório — label cadastrado no Maestro
88
+ parameters=[ # opcional
89
+ {"label": "param1", "value": "valor1"},
90
+ ],
91
+ priority=1, # opcional, padrão 1
92
+ min_execution_date=datetime(...), # opcional — executa somente após esse momento
93
+ )
94
+ ```
95
+
96
+ | Parâmetro | Tipo | Descrição |
97
+ | -------------------- | ------------ | ------------------------------------------------- |
98
+ | `label` | `str` | Label da automação cadastrada no Maestro |
99
+ | `parameters` | `list[dict]` | Lista de `{"label": ..., "value": ...}` |
100
+ | `priority` | `int` | Prioridade da tarefa (padrão: `1`) |
101
+ | `min_execution_date` | `datetime` | Data/hora mínima para o runner iniciar a execução |
102
+
103
+ ## Exceções
104
+
105
+ | Exceção | Quando |
106
+ | ------------------------ | -------------------------------------------------- |
107
+ | `MaestroConfigError` | Credenciais ausentes na inicialização |
108
+ | `MaestroAuthError` | Credenciais inválidas ou token expirado |
109
+ | `MaestroConnectionError` | Falha de rede ou `requests` não instalado |
110
+ | `MaestroError` | Automação não encontrada, parâmetro inválido, etc. |
111
+
112
+ ## Licença
113
+
114
+ Copyright © 2026 4HandsBot. Todos os direitos reservados.
115
+
116
+ O uso deste SDK é permitido exclusivamente por clientes autorizados,
117
+ em conjunto com os serviços da plataforma. É proibida a redistribuição,
118
+ publicação, sublicenciamento ou utilização fora dessa finalidade.
@@ -0,0 +1,11 @@
1
+ LICENSE
2
+ README.md
3
+ pyproject.toml
4
+ handsbot_maestro_sdk.egg-info/PKG-INFO
5
+ handsbot_maestro_sdk.egg-info/SOURCES.txt
6
+ handsbot_maestro_sdk.egg-info/dependency_links.txt
7
+ handsbot_maestro_sdk.egg-info/requires.txt
8
+ handsbot_maestro_sdk.egg-info/top_level.txt
9
+ maestro/__init__.py
10
+ maestro/client.py
11
+ maestro/exceptions.py
@@ -0,0 +1,11 @@
1
+ from .client import MaestroSDK, Task
2
+ from .exceptions import MaestroError, MaestroAuthError, MaestroConnectionError, MaestroConfigError
3
+
4
+ __all__ = [
5
+ "MaestroSDK",
6
+ "Task",
7
+ "MaestroError",
8
+ "MaestroAuthError",
9
+ "MaestroConnectionError",
10
+ "MaestroConfigError",
11
+ ]
@@ -0,0 +1,205 @@
1
+ import os
2
+ import sys
3
+ import time
4
+ from datetime import datetime
5
+ from typing import Optional, List, Dict, Any
6
+
7
+ if hasattr(sys.stdout, "reconfigure"):
8
+ sys.stdout.reconfigure(encoding="utf-8")
9
+
10
+ try:
11
+ import requests as _requests
12
+ _HAS_REQUESTS = True
13
+ except ImportError:
14
+ _HAS_REQUESTS = False
15
+
16
+ from .exceptions import MaestroAuthError, MaestroConnectionError, MaestroConfigError, MaestroError
17
+
18
+ _TOKEN_REFRESH_MARGIN = 300 # renova 5 min antes de expirar
19
+
20
+
21
+ class Task:
22
+ """Tarefa retornada pela API após criação."""
23
+
24
+ def __init__(self, data: Dict[str, Any]):
25
+ self.uuid: str = data.get("uuid", "")
26
+ self.status: str = data.get("status", "")
27
+ self.priority: int = data.get("priority", 1)
28
+ self.min_execution_date: Optional[str] = data.get("min_execution_date")
29
+ self._raw = data
30
+
31
+ def __repr__(self) -> str:
32
+ return f"Task(uuid={self.uuid!r}, status={self.status!r})"
33
+
34
+
35
+ class MaestroSDK:
36
+ """
37
+ SDK Python para o Maestro (4HandsBot).
38
+
39
+ Cria e enfileira tarefas de automação via API.
40
+
41
+ Configuração — duas formas (argumentos têm precedência sobre variáveis de ambiente):
42
+
43
+ 1. Variáveis de ambiente:
44
+ MAESTRO_API_URL, MAESTRO_WORKSPACE, MAESTRO_LOGIN, MAESTRO_KEYPASS
45
+
46
+ 2. Argumentos do construtor (útil para testes locais):
47
+ sdk = MaestroSDK(
48
+ api_url="http://localhost:3001/api/v1",
49
+ workspace="minha-empresa",
50
+ login="automacao@empresa.com",
51
+ keypass="senha",
52
+ )
53
+
54
+ A autenticação ocorre na inicialização — se as credenciais forem inválidas
55
+ ou a API estiver inacessível, uma exceção é lançada imediatamente.
56
+ """
57
+
58
+ def __init__(
59
+ self,
60
+ api_url: Optional[str] = None,
61
+ workspace: Optional[str] = None,
62
+ login: Optional[str] = None,
63
+ keypass: Optional[str] = None,
64
+ ):
65
+ self._api_url = api_url or os.environ.get("MAESTRO_API_URL")
66
+ self._workspace = workspace or os.environ.get("MAESTRO_WORKSPACE")
67
+ self._login = login or os.environ.get("MAESTRO_LOGIN")
68
+ self._keypass = keypass or os.environ.get("MAESTRO_KEYPASS")
69
+
70
+ self._token: Optional[str] = None
71
+ self._token_expires_at: Optional[float] = None
72
+
73
+ self._assert_api_config()
74
+ self._assert_requests()
75
+ self._do_authenticate()
76
+
77
+ def create_task(
78
+ self,
79
+ label: str,
80
+ parameters: Optional[List[Dict[str, str]]] = None,
81
+ priority: int = 1,
82
+ min_execution_date: Optional[datetime] = None,
83
+ ) -> Task:
84
+ """
85
+ Cria e enfileira uma tarefa pelo label da automação.
86
+
87
+ Args:
88
+ label: Label da automação cadastrada no Maestro.
89
+ parameters: Lista de dicionários {"label": ..., "value": ...}.
90
+ Os labels devem corresponder aos parâmetros da automação.
91
+ priority: Prioridade da tarefa (padrão: 1).
92
+ min_execution_date: Data/hora mínima para execução. Se informada, a tarefa
93
+ só será iniciada pelo runner após esse momento.
94
+
95
+ Returns:
96
+ Task com uuid e status inicial ("pending").
97
+
98
+ Raises:
99
+ MaestroError: Automação não encontrada ou parâmetro inválido.
100
+ MaestroAuthError: Credenciais inválidas ou token expirado.
101
+ MaestroConnectionError: Falha de rede.
102
+ """
103
+ body: Dict[str, Any] = {
104
+ "label": label,
105
+ "priority": priority,
106
+ "parameters": parameters or [],
107
+ }
108
+ if min_execution_date is not None:
109
+ body["min_execution_date"] = min_execution_date.isoformat()
110
+
111
+ resp = self._request("POST", "/tasks/by-label", json=body)
112
+
113
+ if resp.status_code == 404:
114
+ raise MaestroError(resp.json().get("error", f"Automação '{label}' não encontrada."))
115
+ if resp.status_code == 400:
116
+ raise MaestroError(resp.json().get("error", "Parâmetros inválidos."))
117
+ if not resp.ok:
118
+ raise MaestroError(f"Erro ao criar tarefa (HTTP {resp.status_code}): {resp.text}")
119
+
120
+ return Task(resp.json())
121
+
122
+ # ------------------------------------------------------------------
123
+ # Autenticação (interno)
124
+ # ------------------------------------------------------------------
125
+
126
+ def _authenticate(self) -> str:
127
+ if self._token and self._token_expires_at:
128
+ if time.time() < self._token_expires_at - _TOKEN_REFRESH_MARGIN:
129
+ return self._token
130
+ self._do_authenticate()
131
+ return self._token # type: ignore[return-value]
132
+
133
+ def _do_authenticate(self) -> None:
134
+ self._assert_requests()
135
+ self._assert_api_config()
136
+
137
+ url = f"{self._api_url}/auth/client-login"
138
+ body = {
139
+ "workspace": self._workspace,
140
+ "login": self._login,
141
+ "keypass": self._keypass,
142
+ }
143
+ headers = {"Content-Type": "application/json", "X-Client-Type": "sdk"}
144
+
145
+ try:
146
+ resp = _requests.post(url, json=body, headers=headers, timeout=30)
147
+ except _requests.RequestException as exc:
148
+ raise MaestroConnectionError(f"Falha ao conectar à API Maestro: {exc}") from exc
149
+
150
+ if resp.status_code == 401:
151
+ raise MaestroAuthError("Credenciais inválidas.")
152
+ if not resp.ok:
153
+ raise MaestroAuthError(f"Falha na autenticação (HTTP {resp.status_code}): {resp.text}")
154
+
155
+ data = resp.json()
156
+ self._token = data["token"]
157
+ expires_raw: str = data["expires_at"]
158
+ dt = datetime.fromisoformat(expires_raw.replace("Z", "+00:00"))
159
+ self._token_expires_at = dt.timestamp()
160
+
161
+ def _request(self, method: str, endpoint: str, **kwargs: Any) -> Any:
162
+ self._assert_api_config()
163
+ self._assert_requests()
164
+
165
+ url = f"{self._api_url}{endpoint}"
166
+ headers = {"Authorization": f"Bearer {self._authenticate()}", "X-Client-Type": "sdk"}
167
+ headers.update(kwargs.pop("headers", {}))
168
+
169
+ resp = _requests.request(method, url, headers=headers, timeout=30, **kwargs)
170
+
171
+ if resp.status_code == 498:
172
+ self._token = None
173
+ headers["Authorization"] = f"Bearer {self._authenticate()}"
174
+ resp = _requests.request(method, url, headers=headers, timeout=30, **kwargs)
175
+
176
+ return resp
177
+
178
+ # ------------------------------------------------------------------
179
+ # Helpers
180
+ # ------------------------------------------------------------------
181
+
182
+ def _assert_api_config(self) -> None:
183
+ missing = [
184
+ name
185
+ for name, val in [
186
+ ("api_url", self._api_url),
187
+ ("workspace", self._workspace),
188
+ ("login", self._login),
189
+ ("keypass", self._keypass),
190
+ ]
191
+ if not val
192
+ ]
193
+ if missing:
194
+ raise MaestroConfigError(
195
+ f"Configuração incompleta — campos ausentes: {', '.join(missing)}. "
196
+ "Passe via variáveis de ambiente (MAESTRO_API_URL, MAESTRO_WORKSPACE, "
197
+ "MAESTRO_LOGIN, MAESTRO_KEYPASS) ou pelos argumentos do construtor."
198
+ )
199
+
200
+ def _assert_requests(self) -> None:
201
+ if not _HAS_REQUESTS:
202
+ raise MaestroConnectionError(
203
+ "O pacote 'requests' é necessário. "
204
+ "Instale com: pip install handsbot-maestro-sdk"
205
+ )
@@ -0,0 +1,11 @@
1
+ class MaestroError(Exception):
2
+ pass
3
+
4
+ class MaestroAuthError(MaestroError):
5
+ pass
6
+
7
+ class MaestroConnectionError(MaestroError):
8
+ pass
9
+
10
+ class MaestroConfigError(MaestroError):
11
+ pass
@@ -0,0 +1,35 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "handsbot-maestro-sdk"
7
+ version = "0.1.0"
8
+ description = "SDK Python para criação de tarefas no Maestro (4HandsBot)"
9
+ readme = "README.md"
10
+ license-files = ["LICENSE"]
11
+ requires-python = ">=3.9"
12
+ dependencies = [
13
+ "requests>=2.31.0",
14
+ ]
15
+ keywords = ["maestro", "handsbot", "automation", "rpa", "sdk"]
16
+ classifiers = [
17
+ "Programming Language :: Python :: 3",
18
+ "Programming Language :: Python :: 3.9",
19
+ "Programming Language :: Python :: 3.10",
20
+ "Programming Language :: Python :: 3.11",
21
+ "Programming Language :: Python :: 3.12",
22
+ "License :: Other/Proprietary License",
23
+ "Operating System :: OS Independent",
24
+ "Intended Audience :: Developers",
25
+ "Topic :: Software Development :: Libraries :: Python Modules",
26
+ ]
27
+
28
+ [project.urls]
29
+ Homepage = "https://github.com/fourhandsbot/maestro"
30
+ "Bug Tracker" = "https://github.com/fourhandsbot/maestro/issues"
31
+
32
+ [tool.setuptools.packages.find]
33
+ where = ["."]
34
+ include = ["maestro*"]
35
+ exclude = ["example*", ".venv*"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+