mtcli 3.8.0.dev7__py3-none-any.whl → 3.8.0.dev9__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)
mtcli/database.py CHANGED
@@ -41,7 +41,7 @@ def get_connection():
41
41
  conn.execute("PRAGMA journal_mode=WAL")
42
42
  conn.execute("PRAGMA synchronous=NORMAL")
43
43
  conn.execute("PRAGMA temp_store=MEMORY")
44
- conn.execute("PRAGMA mmap_size=268435456")
44
+ conn.execute("PRAGMA mmap_size=30000000000")
45
45
  conn.execute("PRAGMA cache_size=-200000")
46
46
  conn.execute("PRAGMA journal_size_limit=67108864")
47
47
  conn.execute("PRAGMA read_uncommitted = TRUE")
@@ -114,7 +114,7 @@ class TickRepository:
114
114
 
115
115
  cursor.executemany(
116
116
  """
117
- INSERT INTO ticks(
117
+ INSERT OR IGNORE INTO ticks(
118
118
  symbol,
119
119
  time_msc,
120
120
  bid,
@@ -124,12 +124,11 @@ class TickRepository:
124
124
  flags
125
125
  )
126
126
  VALUES (?,?,?,?,?,?,?)
127
- ON CONFLICT(symbol,time_msc) DO NOTHING
128
127
  """,
129
128
  data,
130
129
  )
131
130
 
132
- return len(data)
131
+ return cursor.rowcount
133
132
 
134
133
  # ==========================================================
135
134
  # CONSULTAS
@@ -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,91 @@
1
+ """
2
+ Migration 007
3
+
4
+ Objetivo
5
+ --------
6
+
7
+ 1. Remover registros duplicados da tabela `ticks`
8
+ 2. Criar índice UNIQUE para evitar duplicação futura
9
+
10
+ Critério de unicidade adotado:
11
+
12
+ (symbol, time_msc)
13
+
14
+ Estratégia
15
+ ----------
16
+
17
+ 1. Criar tabela temporária com SELECT DISTINCT
18
+ 2. Copiar dados únicos
19
+ 3. Substituir tabela original
20
+ 4. Criar índice UNIQUE
21
+
22
+ Essa estratégia é muito mais rápida do que DELETE em tabelas grandes.
23
+ """
24
+
25
+ from sqlite3 import Connection
26
+
27
+
28
+ def upgrade(conn: Connection) -> None:
29
+ cursor = conn.cursor()
30
+
31
+ # ---------------------------------------------------------
32
+ # 1 - criar nova tabela sem duplicados
33
+ # ---------------------------------------------------------
34
+
35
+ cursor.execute(
36
+ """
37
+ CREATE TABLE IF NOT EXISTS ticks_new AS
38
+ SELECT DISTINCT *
39
+ FROM ticks
40
+ """
41
+ )
42
+
43
+ # ---------------------------------------------------------
44
+ # 2 - remover tabela antiga
45
+ # ---------------------------------------------------------
46
+
47
+ cursor.execute("DROP TABLE ticks")
48
+
49
+ # ---------------------------------------------------------
50
+ # 3 - renomear tabela nova
51
+ # ---------------------------------------------------------
52
+
53
+ cursor.execute("ALTER TABLE ticks_new RENAME TO ticks")
54
+
55
+ # ---------------------------------------------------------
56
+ # 4 - recriar índice de performance existente
57
+ # ---------------------------------------------------------
58
+
59
+ cursor.execute(
60
+ """
61
+ CREATE INDEX IF NOT EXISTS idx_ticks_symbol_time
62
+ ON ticks(symbol, time_msc)
63
+ """
64
+ )
65
+
66
+ # ---------------------------------------------------------
67
+ # 5 - criar índice UNIQUE
68
+ # ---------------------------------------------------------
69
+
70
+ cursor.execute(
71
+ """
72
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_ticks_unique
73
+ ON ticks(symbol, time_msc)
74
+ """
75
+ )
76
+
77
+ conn.commit()
78
+
79
+
80
+ def downgrade(conn: Connection) -> None:
81
+ cursor = conn.cursor()
82
+
83
+ # Remove índice UNIQUE caso exista rollback
84
+
85
+ cursor.execute(
86
+ """
87
+ DROP INDEX IF EXISTS idx_ticks_unique
88
+ """
89
+ )
90
+
91
+ 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.dev9
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
@@ -13,21 +16,24 @@ mtcli/data/__init__.py,sha256=NMzgUoiyY5OUFJkmR-OCFF2fOTY9vp-64z8-bh7HEcs,64
13
16
  mtcli/data/base.py,sha256=Hv1r1IlIhFVEhINWz90FZptYIdhyBKxhMBn5odJfT_8,314
14
17
  mtcli/data/csv.py,sha256=P007I9SoK51-lD_OXXjZu4NkKaGgNr2HRQ3pc_pS1XQ,1008
15
18
  mtcli/data/mt5.py,sha256=wsF14Vm5xXw0QbjHjC-tvXjjMADQWCrhkJ6ozbDLbzk,2880
16
- mtcli/database.py,sha256=xZXVg2GcpAAW83KWLt-u8ATqDyXW8mR-q68-8HUe0O4,1999
19
+ mtcli/database.py,sha256=0sDfSWgmI_TuVFOVG-pgnHJm8CGSLbnweLTfTomEjoo,2001
17
20
  mtcli/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
21
  mtcli/domain/timeframe.py,sha256=nG7vB01d1TyhInHaIZgCPYyVhbiklMIOSgxZnJ7MI6Q,2034
19
22
  mtcli/logger.py,sha256=fEj_meH9-H7CBm1qf1FYhs6QodP7KuYO4ptCyr8WlOc,3677
20
23
  mtcli/marketdata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
24
  mtcli/marketdata/tick_cache.py,sha256=T-auTfkhk5s-TZkaVaTuJGLEnaoxyED7yPr6CGyUDfM,1191
22
25
  mtcli/marketdata/tick_engine.py,sha256=YKU66-NJh2hlK8GZdclk3kBgP7VYEyiLawYNYcIDonA,2930
23
- 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
26
+ mtcli/marketdata/tick_repository.py,sha256=HrMRXDSbZN4Y2Z3jEYpbJcEtUveQn-oi5P2hlIdq8H4,5481
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
33
+ mtcli/migrations/007_deduplicate_ticks_and_add_unique_index.py,sha256=OVh8N2uUNlev71dGtqukdvlPhONOfkp2pW6OacTeeFg,2242
29
34
  mtcli/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- mtcli/migrations/runner.py,sha256=1ArCvMXP9qV0se7n2NWsaByomBpGBhO6x9M8auH68c4,2048
35
+ mtcli/migrations/__main__.py,sha256=S10PGkeeewNMge5X3eGpfNyWc3g7_ZdoTO1veJuZol4,132
36
+ mtcli/migrations/runner.py,sha256=P4EvF-_C0enBUx_lbx1fINim7_wJDwLY_ji3zispxZ4,5374
31
37
  mtcli/models/__init__.py,sha256=mkEpxtmwIl3AhP-RNhr-jSdyK_MREjySPZASmOD53CQ,35
32
38
  mtcli/models/bar_model.py,sha256=yCnHrKWmslcQZ-HN7Lbs3clSahS0-yu8s6vjM-FI1mw,2999
33
39
  mtcli/models/bars_model.py,sha256=srq7YEsyyeI0e7rcsDUAfVPoxbBq0oWXPUpqRseRrPs,674
@@ -76,8 +82,8 @@ mtcli/views/ranges_view.py,sha256=5gA2bAJuco-Xj964nsjs87tZ-079O7xKvaeif1UJ-PQ,12
76
82
  mtcli/views/rates_view.py,sha256=Jkdbg-Q_OVJuID-Q9HFUVICCF1jE82d-qfZWNm1JJ_4,1214
77
83
  mtcli/views/vars_view.py,sha256=Vpcej41qnZSvvSyvXYyW8W7CEFdqTxBd8NczV84XPJY,1635
78
84
  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,,
85
+ mtcli-3.8.0.dev9.dist-info/entry_points.txt,sha256=nXgZqVVUkbj5drC8CLfELsz1DcRKGQcSh_NHOU_s9Xs,127
86
+ mtcli-3.8.0.dev9.dist-info/licenses/LICENSE,sha256=Z-2ANeRgM9IjXnHeg9mA2gillM6eTQj8sIExAGNe2-8,1092
87
+ mtcli-3.8.0.dev9.dist-info/METADATA,sha256=wVJpMbf20CN38f4czCWY8hzIplVA8jDGwlMmX8xh4ls,3654
88
+ mtcli-3.8.0.dev9.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
89
+ mtcli-3.8.0.dev9.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)