mtcli 3.8.0.dev7__py3-none-any.whl → 3.8.0.dev8__py3-none-any.whl

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.
mtcli/__main__.py ADDED
@@ -0,0 +1,3 @@
1
+ from .cli import mt
2
+
3
+ mt()
mtcli/cli.py CHANGED
@@ -27,7 +27,6 @@ from mtcli.marketdata.tick_engine import TickEngine
27
27
 
28
28
  from .commands.bars import bars
29
29
  from .commands.doctor import doctor
30
- from .commands.migrate import migrate
31
30
  from .commands.ticks import ticks
32
31
 
33
32
 
@@ -89,7 +88,6 @@ def mt(ctx):
89
88
  mt.add_command(doctor, name="doctor")
90
89
  mt.add_command(bars, name="bars")
91
90
  mt.add_command(doctor, name="dr")
92
- mt.add_command(migrate)
93
91
  mt.add_command(ticks)
94
92
 
95
93
  loaded_plugins = load_plugins(mt)
mtcli/cli_dev.py ADDED
@@ -0,0 +1,8 @@
1
+ import click
2
+ from .commands_dev.migrate import migrate
3
+
4
+ @click.group()
5
+ def cli():
6
+ pass
7
+
8
+ cli.add_command(migrate)
File without changes
@@ -0,0 +1,48 @@
1
+ """
2
+ Comando CLI para execução das migrations do banco de dados.
3
+
4
+ Este comando aplica todas as migrations pendentes no banco
5
+ utilizado pelo mtcli.
6
+
7
+ Fluxo de execução:
8
+
9
+ 1. Abre conexão com o banco SQLite
10
+ 2. Executa o migration runner
11
+ 3. Aplica migrations ainda não executadas
12
+
13
+ Uso:
14
+
15
+ mtcli migrate
16
+
17
+ Este comando é implementado utilizando o framework
18
+ :contentReference[oaicite:1]{index=1} para construção de aplicações CLI.
19
+ """
20
+
21
+ import click
22
+
23
+ from mtcli.database import get_connection
24
+ from mtcli.migrations.runner import run_migrations
25
+
26
+
27
+ @click.command()
28
+ def migrate():
29
+ """
30
+ Executa as migrations pendentes do banco de dados.
31
+
32
+ O comando conecta ao banco configurado no mtcli
33
+ e executa o migration runner responsável por:
34
+
35
+ - detectar migrations disponíveis
36
+ - identificar a versão atual do schema
37
+ - aplicar migrations pendentes
38
+ - registrar migrations aplicadas
39
+
40
+ Este comando é normalmente executado:
41
+
42
+ - na primeira inicialização do sistema
43
+ - após atualização de versão do mtcli
44
+ """
45
+
46
+ conn = get_connection()
47
+
48
+ run_migrations(conn)
@@ -1,4 +1,34 @@
1
+ """
2
+ Migration 001
3
+
4
+ Cria o schema inicial do banco de dados do mtcli.
5
+
6
+ Esta migration cria a tabela principal `ticks`, responsável por
7
+ armazenar os ticks de mercado capturados do MetaTrader.
8
+
9
+ Estrutura inicial:
10
+
11
+ - symbol : símbolo do ativo
12
+ - time : timestamp em segundos
13
+ - bid : preço bid
14
+ - ask : preço ask
15
+ - last : último preço negociado
16
+ - volume : volume do tick
17
+ - flags : flags fornecidas pela API MT5
18
+
19
+ Também cria o índice `idx_ticks_symbol_time` para acelerar
20
+ consultas por símbolo e tempo.
21
+ """
22
+
23
+
1
24
  def upgrade(conn):
25
+ """
26
+ Executa a migration inicial criando a tabela `ticks`
27
+ e o índice principal utilizado nas consultas.
28
+
29
+ A operação é idempotente graças ao uso de
30
+ `CREATE TABLE IF NOT EXISTS`.
31
+ """
2
32
 
3
33
  conn.execute("""
4
34
  CREATE TABLE IF NOT EXISTS ticks(
@@ -1,4 +1,32 @@
1
+ """
2
+ Migration 002
3
+
4
+ Adiciona a coluna `time_msc` à tabela `ticks`.
5
+
6
+ A API do MetaTrader fornece timestamps com resolução em
7
+ milissegundos (`time_msc`). Esta migration adiciona suporte
8
+ a esse campo sem quebrar compatibilidade com bancos antigos.
9
+ """
10
+
11
+
1
12
  def column_exists(conn, table, column):
13
+ """
14
+ Verifica se uma coluna existe em uma tabela SQLite.
15
+
16
+ Parameters
17
+ ----------
18
+ conn : sqlite3.Connection
19
+ Conexão com o banco de dados.
20
+ table : str
21
+ Nome da tabela.
22
+ column : str
23
+ Nome da coluna.
24
+
25
+ Returns
26
+ -------
27
+ bool
28
+ True se a coluna existir.
29
+ """
2
30
 
3
31
  cursor = conn.execute(f"PRAGMA table_info({table})")
4
32
 
@@ -10,6 +38,10 @@ def column_exists(conn, table, column):
10
38
 
11
39
 
12
40
  def upgrade(conn):
41
+ """
42
+ Adiciona a coluna `time_msc` à tabela `ticks`
43
+ caso ela ainda não exista.
44
+ """
13
45
 
14
46
  if not column_exists(conn, "ticks", "time_msc"):
15
47
 
@@ -1,4 +1,27 @@
1
+ """
2
+ Migration 003
3
+
4
+ Otimiza a tabela `ticks` convertendo-a para `WITHOUT ROWID`.
5
+
6
+ Tabelas SQLite com chave primária composta podem ter melhor
7
+ performance e menor uso de disco utilizando `WITHOUT ROWID`.
8
+
9
+ Para aplicar esta otimização é necessário reconstruir a tabela.
10
+ """
11
+
12
+
1
13
  def upgrade(conn):
14
+ """
15
+ Reconstrói a tabela `ticks` utilizando `WITHOUT ROWID`.
16
+
17
+ Processo executado:
18
+
19
+ 1. Cria nova tabela otimizada
20
+ 2. Copia os dados da tabela antiga
21
+ 3. Remove tabela antiga
22
+ 4. Renomeia nova tabela
23
+ 5. Recria índices necessários
24
+ """
2
25
 
3
26
  cursor = conn.execute("""
4
27
  SELECT sql
@@ -1,4 +1,26 @@
1
+ """
2
+ Migration 004
3
+
4
+ Reconstrói a tabela `ticks` utilizando `time_msc` como parte
5
+ da chave primária.
6
+
7
+ Motivação:
8
+
9
+ - `time` possui resolução em segundos
10
+ - `time_msc` possui resolução em milissegundos
11
+ - múltiplos ticks podem ocorrer dentro do mesmo segundo
12
+
13
+ Nova chave primária:
14
+
15
+ PRIMARY KEY(symbol, time_msc)
16
+ """
17
+
18
+
1
19
  def upgrade(conn):
20
+ """
21
+ Reconstrói a tabela `ticks` alterando a chave primária
22
+ para `(symbol, time_msc)`.
23
+ """
2
24
 
3
25
  cursor = conn.execute("""
4
26
  SELECT sql
@@ -1,4 +1,31 @@
1
+ """
2
+ Migration 005
3
+
4
+ Aplica compressão de preços nos ticks.
5
+
6
+ Preços e volume passam a ser armazenados como inteiros
7
+ para reduzir uso de espaço em disco.
8
+
9
+ Transformações aplicadas:
10
+
11
+ bid -> INTEGER (bid * 100)
12
+ ask -> INTEGER (ask * 100)
13
+ last -> INTEGER (last * 100)
14
+ volume -> INTEGER
15
+
16
+ A tabela precisa ser reconstruída para alterar os tipos
17
+ das colunas.
18
+ """
19
+
20
+
1
21
  def upgrade(conn):
22
+ """
23
+ Reconstrói a tabela `ticks` aplicando compressão
24
+ de preços e volumes.
25
+
26
+ Isso reduz significativamente o tamanho do banco
27
+ e melhora performance de leitura.
28
+ """
2
29
 
3
30
  cursor = conn.execute("""
4
31
  SELECT sql
@@ -0,0 +1,32 @@
1
+ """
2
+ Migration 006
3
+
4
+ Cria índice para acelerar consultas por símbolo e tempo
5
+ utilizando a coluna `time_msc`.
6
+
7
+ Este índice é importante para consultas comuns como:
8
+
9
+ SELECT * FROM ticks
10
+ WHERE symbol = ?
11
+ ORDER BY time_msc
12
+ """
13
+
14
+ SQL = """
15
+ CREATE INDEX IF NOT EXISTS idx_ticks_symbol_time
16
+ ON ticks(symbol, time_msc);
17
+ """
18
+
19
+
20
+ def upgrade(conn):
21
+ """
22
+ Executa a criação do índice `idx_ticks_symbol_time`.
23
+
24
+ A operação é idempotente graças ao uso de
25
+ `CREATE INDEX IF NOT EXISTS`.
26
+ """
27
+
28
+ cursor = conn.cursor()
29
+
30
+ cursor.execute(SQL)
31
+
32
+ conn.commit()
@@ -0,0 +1,7 @@
1
+ from mtcli.database import get_connection
2
+ from .runner import run_migrations
3
+
4
+
5
+ conn = get_connection()
6
+ run_migrations(conn)
7
+
@@ -1,3 +1,28 @@
1
+ """
2
+ Migration Runner do mtcli.
3
+
4
+ Responsabilidades:
5
+
6
+ 1. Descobrir migrations disponíveis no diretório `mtcli/migrations`
7
+ 2. Determinar a versão atual do schema no banco
8
+ 3. Executar migrations pendentes em ordem
9
+ 4. Registrar migrations aplicadas na tabela `schema_migrations`
10
+
11
+ Formato obrigatório das migrations:
12
+
13
+ NNN_nome_da_migration.py
14
+
15
+ Exemplo:
16
+
17
+ 001_initial_schema.py
18
+ 002_ticks_time_msc.py
19
+ 003_optimize_ticks_without_rowid.py
20
+
21
+ Cada migration deve implementar:
22
+
23
+ def upgrade(conn)
24
+ """
25
+
1
26
  import importlib
2
27
  from pathlib import Path
3
28
 
@@ -6,7 +31,42 @@ MIGRATIONS_DIR = Path(__file__).parent
6
31
  PACKAGE = "mtcli.migrations"
7
32
 
8
33
 
34
+ # ---------------------------------------------------------
35
+ # Infraestrutura
36
+ # ---------------------------------------------------------
37
+
38
+ def ensure_migrations_table(conn):
39
+ """
40
+ Garante que a tabela `schema_migrations` exista.
41
+
42
+ Esta tabela armazena quais migrations já foram
43
+ aplicadas no banco.
44
+ """
45
+
46
+ conn.execute("""
47
+ CREATE TABLE IF NOT EXISTS schema_migrations(
48
+ version INTEGER PRIMARY KEY,
49
+ applied_at TEXT NOT NULL
50
+ )
51
+ """)
52
+
53
+ conn.commit()
54
+
55
+
56
+ # ---------------------------------------------------------
57
+ # Estado do banco
58
+ # ---------------------------------------------------------
59
+
9
60
  def get_current_version(conn):
61
+ """
62
+ Retorna a versão atual do schema.
63
+
64
+ Returns
65
+ -------
66
+ int
67
+ Maior versão registrada em `schema_migrations`.
68
+ Retorna 0 se nenhuma migration foi aplicada.
69
+ """
10
70
 
11
71
  cursor = conn.execute(
12
72
  "SELECT MAX(version) FROM schema_migrations"
@@ -18,6 +78,9 @@ def get_current_version(conn):
18
78
 
19
79
 
20
80
  def mark_version(conn, version):
81
+ """
82
+ Marca uma migration como aplicada.
83
+ """
21
84
 
22
85
  conn.execute(
23
86
  """
@@ -30,7 +93,24 @@ def mark_version(conn, version):
30
93
  conn.commit()
31
94
 
32
95
 
96
+ # ---------------------------------------------------------
97
+ # Descoberta de migrations
98
+ # ---------------------------------------------------------
99
+
33
100
  def discover_migrations():
101
+ """
102
+ Descobre migrations válidas no diretório.
103
+
104
+ Apenas arquivos no formato:
105
+
106
+ NNN_nome.py
107
+
108
+ serão considerados migrations.
109
+
110
+ Returns
111
+ -------
112
+ list[(int,str)]
113
+ """
34
114
 
35
115
  migrations = []
36
116
 
@@ -39,7 +119,13 @@ def discover_migrations():
39
119
  if file.name in ("__init__.py", "runner.py"):
40
120
  continue
41
121
 
42
- version = int(file.name.split("_")[0])
122
+ prefix = file.stem.split("_")[0]
123
+
124
+ # ignora arquivos inválidos
125
+ if not prefix.isdigit():
126
+ continue
127
+
128
+ version = int(prefix)
43
129
 
44
130
  module_name = file.stem
45
131
 
@@ -47,10 +133,45 @@ def discover_migrations():
47
133
 
48
134
  migrations.sort(key=lambda x: x[0])
49
135
 
136
+ validate_migrations(migrations)
137
+
50
138
  return migrations
51
139
 
52
140
 
141
+ def validate_migrations(migrations):
142
+ """
143
+ Valida integridade das migrations.
144
+
145
+ Verifica:
146
+
147
+ - versões duplicadas
148
+ - gaps na sequência
149
+ """
150
+
151
+ versions = [v for v, _ in migrations]
152
+
153
+ if len(versions) != len(set(versions)):
154
+ raise RuntimeError("Duplicate migration versions detected.")
155
+
156
+ if not versions:
157
+ return
158
+
159
+ expected = list(range(min(versions), max(versions) + 1))
160
+
161
+ if versions != expected:
162
+ raise RuntimeError(
163
+ f"Migration sequence gap detected: {versions}"
164
+ )
165
+
166
+
167
+ # ---------------------------------------------------------
168
+ # Compatibilidade com bancos antigos
169
+ # ---------------------------------------------------------
170
+
53
171
  def legacy_database_detected(conn):
172
+ """
173
+ Detecta bancos antigos sem controle de migrations.
174
+ """
54
175
 
55
176
  cursor = conn.execute("""
56
177
  SELECT name
@@ -63,9 +184,8 @@ def legacy_database_detected(conn):
63
184
 
64
185
 
65
186
  def bootstrap_legacy(conn):
66
-
67
187
  """
68
- Marca migration 1 como aplicada se banco já tinha schema.
188
+ Inicializa migrations em banco legado.
69
189
  """
70
190
 
71
191
  if legacy_database_detected(conn):
@@ -78,7 +198,23 @@ def bootstrap_legacy(conn):
78
198
  conn.commit()
79
199
 
80
200
 
201
+ # ---------------------------------------------------------
202
+ # Runner principal
203
+ # ---------------------------------------------------------
204
+
81
205
  def run_migrations(conn):
206
+ """
207
+ Executa migrations pendentes.
208
+
209
+ Fluxo:
210
+
211
+ 1. Garante tabela `schema_migrations`
212
+ 2. Detecta bancos legados
213
+ 3. Descobre migrations
214
+ 4. Executa migrations pendentes
215
+ """
216
+
217
+ ensure_migrations_table(conn)
82
218
 
83
219
  bootstrap_legacy(conn)
84
220
 
@@ -95,6 +231,11 @@ def run_migrations(conn):
95
231
 
96
232
  module = importlib.import_module(module_path)
97
233
 
234
+ if not hasattr(module, "upgrade"):
235
+ raise RuntimeError(
236
+ f"Migration {module_name} does not define upgrade()"
237
+ )
238
+
98
239
  print(f"Applying migration {version}: {module_name}")
99
240
 
100
241
  module.upgrade(conn)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mtcli
3
- Version: 3.8.0.dev7
3
+ Version: 3.8.0.dev8
4
4
  Summary: Aplicativo CLI para exibir gráficos do MetaTrader 5 screen reader friendly
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -1,11 +1,14 @@
1
1
  mtcli/__init__.py,sha256=guFO5EmCfuH8MNujJH8hw_oPg8Ee__QlQgVd-4A3N6o,84
2
- mtcli/cli.py,sha256=dXeTB_hlVroYesn_jD6oMs8LOl9OuOtfgrtp4Nifgto,2644
2
+ mtcli/__main__.py,sha256=cV4B4W1RDBOeAWwocqPzuEfJP2AKccvSzColBIqKA9c,29
3
+ mtcli/cli.py,sha256=-e-6MFnqAJyZjAGqUbVC38TcuixY4DvZ_mRSCgEZD0I,2580
4
+ mtcli/cli_dev.py,sha256=vUBoS5hmcB76tJFMADKWTg4-bWqdOZhuYOnDu8VYHYs,125
3
5
  mtcli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
6
  mtcli/commands/bars.py,sha256=JXXq9HIeFU-VKf8e2rOKTMXx_h5SRcuvKER-mlOjxjM,4205
5
7
  mtcli/commands/conf.py,sha256=nYN3dk9hZVagkf3mP41yBdKUuCKlvzgaF8DHGKbG8OU,866
6
8
  mtcli/commands/doctor.py,sha256=OIuJlQ2-PODGGOXj6pVVULLcyiI5htdERc8l6VHqjYM,4610
7
- mtcli/commands/migrate.py,sha256=iJOkEQObVOIfyCXottn7M38xURByVgXITXVKapoDmfE,208
8
9
  mtcli/commands/ticks.py,sha256=emXXgwDnyxLSEvEO9t3oIHuwXCm2rxV6p7NkeXrUQAk,887
10
+ mtcli/commands_dev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ mtcli/commands_dev/migrate.py,sha256=6PiyAZJSOtPXVxLyaCTPlakM7sAwIt2DrethGrUzzzA,1151
9
12
  mtcli/conecta.py,sha256=PraDErB7wparbosxRdHGhhPYVn02z99Bj9mqfbmE4iw,1074
10
13
  mtcli/conf.py,sha256=-nGmAtAzLZpZYT9arXxg7jUmK4m32aPLuYHKqHsQWuA,8613
11
14
  mtcli/config_registre.py,sha256=H2iVKrQr8NWn3--tszsnZBNk-WoBCXgGFZ1-GGT8mho,1000
@@ -21,13 +24,15 @@ mtcli/marketdata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
21
24
  mtcli/marketdata/tick_cache.py,sha256=T-auTfkhk5s-TZkaVaTuJGLEnaoxyED7yPr6CGyUDfM,1191
22
25
  mtcli/marketdata/tick_engine.py,sha256=YKU66-NJh2hlK8GZdclk3kBgP7VYEyiLawYNYcIDonA,2930
23
26
  mtcli/marketdata/tick_repository.py,sha256=cquyNUcXT6G3ljBqrMR8NxaZai8MuTDPyNunfFWSXJA,5518
24
- mtcli/migrations/001_initial_schema.py,sha256=Xve9r9RRAOtoZQ2iOaD-gdTfxSjaqoaCwGHn_ZSUtlg,439
25
- mtcli/migrations/002_ticks_time_msc.py,sha256=OKpxZZlb5QEKzVaYAt3kgi2vHu5CRoxLHQ4RRzYTX4E,420
26
- mtcli/migrations/003_optimize_ticks_without_rowid.py,sha256=AyOUJA1SvEhNVXnFRpz2FI4hKk1PutHuC6FSneceR4s,1234
27
- mtcli/migrations/004_ticks_pk_time_msc.py,sha256=omwgquaUPEL3IKleeNR1cYOqDQg-rc5W_AZ-f8b765Y,1153
28
- mtcli/migrations/005_tick_price_compression.py,sha256=gyzaBCC4R1vXcEKpU-FKNeFtIqLTNlLXYoscs2Wuvho,1232
27
+ mtcli/migrations/001_initial_schema.py,sha256=5RrlQzCe_4vX73HxFPt9jvjFIRum4r7H61A5_XpH3D0,1199
28
+ mtcli/migrations/002_ticks_time_msc.py,sha256=LraR699iEnYgCqbq3atXU6gvOiH-4G-ETGd1m9HtQVg,1125
29
+ mtcli/migrations/003_optimize_ticks_without_rowid.py,sha256=tlDpRrwfwP9bmWMQETR-mJfh9UHXFdaxouoa9ApWsw0,1803
30
+ mtcli/migrations/004_ticks_pk_time_msc.py,sha256=XFX0QZdajeWZ6HbsRxOhMaNY-_yTgVnC8TZUWe_akME,1609
31
+ mtcli/migrations/005_tick_price_compression.py,sha256=jcuvaujn4ZnS2M40HX8D1kkl3yr3JKHSucjMvCArIWA,1832
32
+ mtcli/migrations/006_add_index_ticks_symbol_time.py,sha256=w94PlUxh_Ux028HzI_4Ei_VyQ-iZJMMCkf0lnWfb5C4,615
29
33
  mtcli/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- mtcli/migrations/runner.py,sha256=1ArCvMXP9qV0se7n2NWsaByomBpGBhO6x9M8auH68c4,2048
34
+ mtcli/migrations/__main__.py,sha256=S10PGkeeewNMge5X3eGpfNyWc3g7_ZdoTO1veJuZol4,132
35
+ mtcli/migrations/runner.py,sha256=P4EvF-_C0enBUx_lbx1fINim7_wJDwLY_ji3zispxZ4,5374
31
36
  mtcli/models/__init__.py,sha256=mkEpxtmwIl3AhP-RNhr-jSdyK_MREjySPZASmOD53CQ,35
32
37
  mtcli/models/bar_model.py,sha256=yCnHrKWmslcQZ-HN7Lbs3clSahS0-yu8s6vjM-FI1mw,2999
33
38
  mtcli/models/bars_model.py,sha256=srq7YEsyyeI0e7rcsDUAfVPoxbBq0oWXPUpqRseRrPs,674
@@ -76,8 +81,8 @@ mtcli/views/ranges_view.py,sha256=5gA2bAJuco-Xj964nsjs87tZ-079O7xKvaeif1UJ-PQ,12
76
81
  mtcli/views/rates_view.py,sha256=Jkdbg-Q_OVJuID-Q9HFUVICCF1jE82d-qfZWNm1JJ_4,1214
77
82
  mtcli/views/vars_view.py,sha256=Vpcej41qnZSvvSyvXYyW8W7CEFdqTxBd8NczV84XPJY,1635
78
83
  mtcli/views/volumes_view.py,sha256=d_6YxM0vA1revwoPwnwUjV19KcqnddVgdpBHTt5Vqms,1575
79
- mtcli-3.8.0.dev7.dist-info/entry_points.txt,sha256=EH8lMNy2L-TCJB3E3EJHF5QySz_b_86oOhcAKAN20-Q,103
80
- mtcli-3.8.0.dev7.dist-info/licenses/LICENSE,sha256=Z-2ANeRgM9IjXnHeg9mA2gillM6eTQj8sIExAGNe2-8,1092
81
- mtcli-3.8.0.dev7.dist-info/METADATA,sha256=601kT3fP5o3adTChzeGS0qNNuwow194PukB7h_RrIGo,3654
82
- mtcli-3.8.0.dev7.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
83
- mtcli-3.8.0.dev7.dist-info/RECORD,,
84
+ mtcli-3.8.0.dev8.dist-info/entry_points.txt,sha256=nXgZqVVUkbj5drC8CLfELsz1DcRKGQcSh_NHOU_s9Xs,127
85
+ mtcli-3.8.0.dev8.dist-info/licenses/LICENSE,sha256=Z-2ANeRgM9IjXnHeg9mA2gillM6eTQj8sIExAGNe2-8,1092
86
+ mtcli-3.8.0.dev8.dist-info/METADATA,sha256=cUi_W4Ibn0a_5jraq1ahW7rifHTf1wgg6EE3ffizye4,3654
87
+ mtcli-3.8.0.dev8.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
88
+ mtcli-3.8.0.dev8.dist-info/RECORD,,
@@ -1,6 +1,7 @@
1
1
  [console_scripts]
2
2
  mt=mtcli.cli:mt
3
3
  mtcli=mtcli.cli:mt
4
+ mtdev=mtcli.cli_dev:cli
4
5
 
5
6
  [mtcli.plugins]
6
7
  internals=mtcli.plugin:register
mtcli/commands/migrate.py DELETED
@@ -1,12 +0,0 @@
1
- import click
2
-
3
- from mtcli.database import get_connection
4
- from mtcli.migrations.runner import run_migrations
5
-
6
-
7
- @click.command()
8
- def migrate():
9
-
10
- conn = get_connection()
11
-
12
- run_migrations(conn)