Janus
2.20.2Destaque GoldOpen SourceCRA-readyChangelog
Todas as mudanças notáveis do projeto Janus (anteriormente ORMBr) serão documentadas neste arquivo.
O formato é baseado em Keep a Changelog, e este projeto adere ao Semantic Versioning.
[Unreleased]
v2.22.5 — 2026-04-28
Changed
- Reorganized
Test/Delphi/Tests/into a layered tree (Common/,Unit/{Core,Mapping.Lazy,Container,Middleware,CodeGen,Criteria},Integration/,RESTHorse/,RESTOracle/,LiveBindings/); 35 fixtures renamed to canonicalTest.Janus.<area>.<subject>.pasand 4 R22N fixtures preserved as-is for the next consolidation step (#191) - Renamed the four DUnitX executors to canonical
Janus.Tests.{Unit,RESTHorse,LiveBindings,RESTOracle}form; consolidated the fourTests.Janus.LiveBindings.R22N.pasfixtures into three release-agnostic units (Test.Janus.LiveBindings.{Base,DataSet,GridColumn}) with[Category('R22.x')]attributes preserving release tagging (#192) - ROADMAP
Gap Fixtures Eraphase added (12 deferred candidates listed without commitment);architecture.mdCriteria-folder drift (DA-003) reconciled on disk; checklist round-rotation; project-evolution closure annotation. Closes the 8-demand audit-driven roadmap (round 61..68) (#193)
Fixed
- Restore
developbranch after release-side commits accumulated only onmainsince v2.22.1 (CHANGELOG.mdjumping from[Unreleased]to[v2.22.1]); merged 10 missing commits forward including v2.22.2/v2.22.3/v2.22.4 changelog entries, ROADMAP delivery markers, and post-release docs updates - Track
docs-src/package-lock.jsonand force-trackdocs-src/package.json/tsconfig.json/_category_.json; the repo-wide*.jsongitignore rule and the per-folder lockfile rule were causing every PR to failbuild-and-publish-docs-folderwithEUSAGE/ENOENT. Expanded.gitignoreto cover Delphi build artifacts (*.obj,*.vrc,*.$manifest), Cygwin crash dumps, local test result/coverage directories, and per-machine Oracle config
v2.22.4 — 2026-04-27
Added
- Orphan-fixture detection script (
detect-orphan-fixtures.sh) wired into/verifygate; detects fixtures present on disk but absent from the 4.dprusesclauses (#185) Janus.Test.Runner.pasandJanus.Test.Bootstrap.pasextracted toTest/Delphi/Common/; shared runner infrastructure now reused across all 4 DUnitX executors (#186)Examples/Delphi/auto-validable.txt— TSV manifest listing all 49 example.dprojwith compile/run/defer/exclude modes and per-row notes (#188)Examples/Delphi/scripts/build_auto_validable.cmd— Windows msbuild driver with manifest drift check and--dry-runmode (#188)Examples/Delphi/scripts/build_auto_validable.sh— POSIX skeleton; delegates to.cmdon Git Bash, no-op on Linux/macOS (#188).github/workflows/examples.yml— separate CI workflow for example compilation gate; same self-hosted Delphi runner and trigger parity withtests.yml(#188)
Changed
DCC_UnitSearchPathstandardized across all 49 example.dprojfiles for headlessmsbuildcompatibility (#187)Examples/Delphi/scripts/canonical-searchpath.txtadded as single source of truth for the 26-entry search path block (#187)- Pre-built
.resresource files updated for FluentSQL and WebService examples
v2.22.3 — 2026-04-27
Changed
- Refresh test inventory in knowledge-base reference files: replace stale "131 tests" claim with 300+ DUnitX tests across 4 executors; rewrite
## Test guardrailsinsupport-matrix.mdwith per-executor subsections (JanusSmoke 26 fixtures / 7wired #170, JanusRestHorse 5, JanusLiveBindings 4, JanusRESTHorseOracle 1); updateconventions.mdandproject-overview.mdaccordingly (#180)
v2.22.2 — 2026-04-27
Fixed
- Refresh
TFakeConnectionmock to satisfyIDBConnection/IDBTransactioncontract; broken stub was silently skipping interface methods (#171) - Wrap five anonymous procedure literals with
TContextEvent/TEventexplicit casts inTestPluginRegistryto resolve compiler type-inference ambiguity (#174)
Changed
- Wire 7 orphan DUnitX fixtures into
JanusSmoke.dpr/.dproj; fixtures were compiled but not registered in the test runner (#170) - Prepend canonical MIT license header to 255 Delphi source artifacts outside
Source/(Examples/,Test/,Components/Packages/Delphi/,Projects/Wizard/) (#175) - Replace remaining LGPL header and
cJANUSSOBRELICENCA = 'LGPL'with MIT inProjects/Wizard/Janus.Reg.pas(#176) - Replace LGPL badge with MIT badge (
License-MIT-blue.svg) inREADME.mdandREADME.en.md; closes last visible LGPL footprint in Janus-owned territory (#178)
v2.22.1 — 2026-04-26
Changed
- Replace LGPL header with canonical MIT header in all 134
Source/.pasfiles; source-level license mismatch with theLICENSEfile is fully resolved (#168) - ROADMAP consolidated: post-v2.22.0 strategic state documented with seven delivered cycles; current and next milestones reset (#167)
- Added
.mailmapto normalize AI co-authorship entries in git history to main contributor identity
v2.22.0 — 2026-04-26
Added
- R22.4 DUnitX fixture (
Tests.Janus.LiveBindings.R224.pas) with 10 tests coveringBindGridColumnattribute binding, regression guard for R22.1–R22.3, andAdapterBindSourceswiring; registered inJanusLiveBindings.dpr(#165)
Changed
Janus.Binder.Attributes.pas: committedBindGridColumnattribute class (previously unstaged);ConfigureGridColumnsparameterAItemTypenow declaredconstin both interface and implementation (#165)- Removed legacy
TJanusLiveBindingsengine units (Janus.LiveBindings.pas,Janus.Controls.Helpers.pas,Janus.VCL.Controls.pas,Janus.FMX.Controls.pas) and FMX example from repository; renamedFGridBindSources→FAdapterBindSourcesinTJanusBinder(#164)
v2.21.0 — 2026-04-26
Added
TJanusBinderengine (R22.1): adapter-based live-bindings withoutTJanusLiveBindingsinheritance;[Bind],[BindGrid],[BindGridDetail],[BindListControl],[BindGridColumn]attributes;Bind(entity)/Refresh/Freelifecycle (#154)BindGrid<T>/ConfigureGridColumns/BindList<T>engine wiring with master-detail and sub-detail grid support; R22.2 DUnitX fixture (31 tests) (#155)BindSourceDBDataSet backend forTJanusBinder:TLinkDataSourceToMaster/TLinkPropertyToFieldwiring fromTDataSource; R22.3 DUnitX fixture (#159)- Oracle REST Horse example (
Examples/Delphi/RESTful/Horse/Oracle/):JanusOracleRESTServer.dprwithTProviderJanus+TProviderDM, 4 entity models, CRUD endpoints, andmodelpedidoscompletosview (#157) TRESTViewManagerlazy-init registry and Oracle AutoView DUnitX fixture (TestJanusRESTOracleAutoView.pas); implicit read-only guard for unmapped routes (#158)JanusRESTHorseConsole.dpr: zero-endpoint canonical demo usingTProviderJanus+TProviderDMwith 4 model registrations and Horse server lifecycle (#153)- Initial
JanusRESTHorseConsolewith zero-endpoint CRUD self-test console forTRESTServerHorse(#152)
Fixed
- Removed erroneous LiveBindings R22.1/R22.2 test entries from
JanusSmoke.dprthat caused false test-suite scope (#156)
Changed
- LiveBindings user manual (
docs-src/docs/janus/user/guides/livebindings.md) fully rewritten to documentTJanusBinderAPI: lifecycle, attributes table, code samples for[Bind]/BindGrid<T>/BindList<T>/[BindGridColumn], and migration guide with R22.6 removal horizon (#161) - VCL LiveBindings example (
Examples/Delphi/Livebindings/VCL/) migrated fromTJanusLiveBindingsto plain PODO +TJanusBinder; FMX example annotated with migration-note comment block (#161)
v2.20.2 — 2026-04-22
Fixed
- Filter-based DELETE in REST/Horse: replaced
FindOne(filter)withFindWhere(filter, '')inFilterExecuteFindofJanus.Server.Resource.pas; objects are now correctly retrieved by OData-converted WHERE clause for filter-based deletes (#145) - Seed data isolation for GET filter tests:
GetWithFilter_EqOperator_ReturnsFilteredandGetWithAndOrFilter_ReturnsCorrectResultinTestJanusRESTHorseIntegration.pasnow insert an Alice record inline before each assertion; filter tests pass regardless of execution order (#145) - DataEngine FireDAC
_InternalExecuteQuery: added missingLResultSet.Nextat 8 while-loop iteration sites inJanus.Server.RestObject.Manager.pas; REST results now iterate correctly through all rows (#147) - OData parser (
Janus.Server.RestQuery.Parse.pas): addedTNetEncoding.URL.Decodebefore tokenization so URL-encoded filters (%20,%27) are correctly parsed; fixed_EmitFunctionSQLto iterate overAArgTokensinstead of raw string to handle commas inside string literals (e.g.contains(name,'Smith, Jr.')); added 2-char lookahead in_TokenizeFilterfor<>,>=,<=so reverse OData path emitsne,ge,le; replaced linearcOpOData/cLogODataarrays withTDictionary<String, String>(O(1) lookup) initialized ininitialization(#149)
Changed
- Workspace hygiene: expanded
.gitignorewith patterns covering 60+ orphaned untracked files (cfg, drc, dres, DLLs in Examples/Test/, XML/txt/bat in Test/Delphi/, Lazarus output, compiled project artifacts); created.local-readonly/folder at workspace root for pipeline support files (#141) - Physical move of
DISCUSSIONS.md,PLAN_LOAD_LAZY.md, andTest/Delphi/SMOKE_LAZY_BASELINE_R18_2.mdto.local-readonly/so these planning artifacts are absent from the working tree (#142) - Added
/Source/Dependencies/Horse/and backup guard patterns (DataEngine-backup,MetaDbDiff-backup) to.gitignore(#143)
v2.20.1 — 2026-04-21
Added
- Suite de testes de integração REST/Horse via Driver: extensão de
RestHorseTest.Base.pascom campoFPrefixe métodoBuildResourceURL; criação deTestJanusRESTHorseDriver.pascom 8 cenários CRUD via prefixoapi/Janus; atualização deJanusRestHorse.dpr(#134) - Controle de acesso por verbo HTTP: atributos
[RESTAllowGET],[RESTAllowPOST],[RESTAllowPUT],[RESTAllowDELETE]aplicáveis a controllers REST/Horse para grant-list granular por método; guard emTAppResourceBaseretorna 405 para verbos não autorizados (#137)
Fixed
- Fechamento dos três caveats pós-release de v2.20.0: remoção da cláusula
uses FluentSQL.Interfacesduplicada emJanus.Server.RestView.Manager.pas; adição da categoriaRESTfulno sidebar do Docusaurus com links paraodata-reference,rest-readonlyerest-join-strategy; adição de exemplo[RESTReadOnly]emHorseJanus.dprcom controller e model dedicados (#133) - Alinhamento do contrato de prefixo nas fixtures de teste: adição de
FPrefix := 'api/Janus'antes deinherited SetupemTestJanusRESTReadOnlyeTestJanusRESTJoinView; substituição de_BuildURLhardcoded por delegação aBuildResourceURLda classe base (#135) - Correção de 6 falhas de AV recorrentes em
JanusRestHorse.exe: migração do ciclo de vida do servidor Horse emTRestHorseTestBasede[Setup]/[TearDown]por-teste para[SetupFixture]/[TearDownFixture]por-fixture; adição deJanus.DML.Generator.SQLiteausente noJanusRestHorse.dpr; nil-guards defensivos emJanus.Command.Abstract.paseJanus.Server.RestObject.Manager.pas(#138)
v2.20.0 — 2026-04-20
Added
[RESTReadOnly]attribute inMetaDbDiff.Mapping.Attributeswith cache inTMappingExplorerand write guard inTAppResourceBase(ParseInsert/ParseUpdate/ParseDelete) — deterministic JSON error response for blocked write operations (#130)TRESTViewManagerinJanus.Server.RestView.Manager.pas: EnsureView DDL flow via FluentSQL DDL + DataEngine supportsCREATE OR REPLACE VIEW(MySQL/MariaDB/PostgreSQL/Oracle) and DROP+CREATE (SQLite/Firebird) (#130)TestJanusRESTQueryParse.pas: 44 OData parser unit tests added toJanusSmoke.dpr(#130)JanusRestHorse.dprwithTestJanusRESTHorseIntegration.pas(12 CRUD integration tests),TestJanusRESTReadOnly.pas(6 tests),TestJanusRESTJoinView.pas(6 tests) (#130)- Documentation pages:
odata-reference.md,rest-readonly.md,rest-join-strategy.mdindocs-src/docs/janus/; links added torestful.md(#130) - Horse example
README.mdwith step-by-step instructions for read-only,$expand, and VIEW scenarios (#130)
Changed
- OData parser (
Janus.Server.RestQuery.Parse.pas): replaced globalStringReplacewith word-boundary tokenizer (_TokenizeFilter/_EmitSQL) eliminating field-name corruption (e.g.adicional→+icional); addedand/or/notlogical operators andcontains/startswith/endswith/tolower/toupperOData functions (#130)
v2.19.14 — 2026-04-12
Changed
- Reconciliacao do escopo da documentacao de manual do usuario, consolidando os arquivos
docs-src/docs/janus/user/index.md,docs-src/docs/janus/user/introduction.mdedocs-src/docs/janus/user/getting-started/quickstart.mdcomo entrega explicita e validada da rodada ESP-004 (#127)
v2.19.13 — 2026-04-10
Fixed
- Correcao do bloqueio de release no gate de develop ao reconciliar o diff tracked preexistente do roadmap, restabelecendo o fluxo deterministico sem alterar runtime/produto (#122)
- Fechamento do gap de confiabilidade na evidencia smoke para Strategy A com semantica de geracao XML deterministica, reduzindo variabilidade ambiental na coleta de provas (#118)
v2.19.11 — 2026-04-08
Changed
- Normalizacao editorial no
ROADMAP.mdpara explicitar a origem textual de R18.1 (de "proxiam demanda" para "proxima demanda") sem alterar classificacao ESP-002, escopo funcional ou handoff planejado (#113)
v2.19.10 — 2026-04-08
Changed
- Consolidacao editorial do milestone R18.1 no
ROADMAP.md, unificando o texto em um item unico com origem "proxiam demanda", classificacao ESP-002 (feature), escopo fechado e handoff pronto para/task(#110)
v2.19.9 — 2026-04-08
Changed
- Atualizacao estrategica do
ROADMAP.mdpara registrar a formalizacao da demanda candidata R18.1 (ESP-002) com escopo fechado para handoff via/task(#110)
v2.19.8 — 2026-04-08
Changed
- Formalizacao da demanda R18.1 (ESP-002) como feature com escopo funcional fechado, criterios de aceite auditaveis e handoff pronto para
/task, com item de milestone registrado noROADMAP.md(#108)
v2.19.7 — 2026-04-08
Changed
- Formalizacao da regra canonica de validacao processual para
/teste/release, com decisao objetiva entre Path A (comando obrigatorio quando executavel) e Path B (N/A formal sob contrato de evidencia), reforcando auditabilidade da pipeline sem alteracao funcional do framework (#107)
v2.19.6 — 2026-04-08
Changed
- Encerramento operacional da validacao ESP-006 com confirmacao de build/smoke (155/155), fechamento da issue de divida tecnica anterior e consolidacao do status de release com caveat ambiental residual no caminho MARS (#101)
v2.19.5 — 2026-04-08
Changed
- Refactor do runtime MARS para padronizar a serializacao JSON via fachada
Janus.Json, removendo o acoplamento direto a helpers JSON legados no caminho REST ativo sem alterar contrato HTTP/assinaturas publicas (#99)
v2.19.4 — 2026-04-08
Changed
- Refactor documental do
ROADMAP.mdpara restaurar seu papel de artefato estrategico, removendo checklist operacional, status por issue e evidencias de pipeline do corpo principal, com destino explicito para historico e rastreabilidade (#97)
v2.19.3 — 2026-04-08
Changed
- Consolidacao operacional da R17.3 com atualizacao do
ROADMAP.mde formalizacao do gate go/no-go para continuidade de R18.x sem introduzir mudancas arquiteturais (#95) - Documentacao tecnica de lazy loading atualizada para refletir o comportamento consolidado de reset/reload de proxies e tratamento de entidades anotadas com
[View]apos v2.19.2 (#95)
v2.19.2 — 2026-04-07
Fixed
- Correcao das 3 falhas funcionais remanescentes da suite JanusSmoke (
TestProxy_ResetProducesNewLoad,TestHelperGetTable_ReturnsNilForViewEntity,TestProxy_ResetAllowsReload) com evidencia de 155/155 testes aprovados (#90) - Fechamento tecnico da divida de estabilizacao pos-release registrada anteriormente, com rastreabilidade consolidada na rodada de correcao (#89)
v2.19.1 — 2026-04-07
Changed
- Hardening interno do lazy transparente:
TSQLCommandExecutoreTRESTObjectManagerpassaram a reutilizar helpers compartilhados emJanus.Mapping.Lazy, eliminando a duplicacao operacional de_InjectLazyFactorysem alterar o contrato publico deLoadLazye do proxy transparente (#84) - Rastreabilidade da R17.2 alinhada no
ROADMAP.mde emdocs-src/docs/janus/, deixando explicito que o ciclo atual endurece a implementacao dav2.19.0sem reabrir a API publicada (#84)
Fixed
- Desbloqueio dos gates finais de compilacao da release com resolucao dos erros
E2003 Undeclared identifier: 'Supports'emTestSmokeLazyLoading.paseF2613 Unit 'SysUtils' not foundno fluxoJanusSmoke(#88)
v2.19.0 — 2026-04-07
Added
TestSmokeLazyLoading(10 testes): baseline de seguranca R17.1 — valida existencia de lazy mapping, ciclo de vida do token, invocacao explicita de proxy e retrocompatibilidade do caminho explicitoLoadLazy(#81)TestDataSetLazyProxy(8 testes): contrato de lazy proxy para contexto DataSet — PK-change reset, deferred load, cache por acesso e idempotencia de re-injecao (#81)TestRestLazyProxy(7 testes): contrato de lazy proxy para contexto REST — detectabilidade de associacoes lazy, ciclo de vida de token, idempotencia de reset (#81)TestLazyProxyMultiplicity(9 testes): validacao de multiplicidades (OneToOne, OneToMany, ManyToOne, ManyToMany) nos tres contextos suportados, com retrocompatibilidade deLoadLazyexplicito (#81)InjectLazyFactoriese_InjectLazyFactoryadicionados aTRESTObjectManager: o contexto REST agora injeta proxy factory para associacoes lazy emFillAssociationem vez de pular (mesma semantica do ObjectSet) (#81)FLazyTokeneFProcessingObjectsadicionados aTRESTObjectManagerpara gerenciar ciclo de vida correto do proxy REST e evitar loops recursivos (#81)
Changed
FillAssociationemTRESTObjectManager: associacoes comLazy = Trueagora chamam_InjectLazyFactoryem vez deContinue, unificando o contrato lazy nos tres contextos (ObjectSet, DataSet, REST) (#81)JanusSmoke.dprampliado com 4 novos modulos de teste:TestSmokeLazyLoading,TestDataSetLazyProxy,TestRestLazyProxy,TestLazyProxyMultiplicity(#81)
v2.18.17 — 2026-04-07
Changed
- Publicacao da demanda candidata R17.2 (pos-R17.1) no
ROADMAP.md, com foco em hardening e adocao do lazy loading transparente, mantendo rastreabilidade e criterios auditaveis para abertura via/task(#79)
v2.18.16 — 2026-04-07
Added
- Cobertura de regressao para classe anotada apenas com
[View]sem[Table]: testesTestHelperGetTable_ReturnsNilForViewEntityeTestGetMappingView_ReturnsViewMappingForViewEntityemTestMappingCache.pas(#78)
Changed
ROADMAP.mdnormalizado pos-R16.3: tres itens de R16.3 marcados como completos e item de reavalicao resolvido com decisao go para R17.x (#78)
v2.18.15 — 2026-04-07
Added
- Cobertura de regressao para entidade anotada apenas com
[View], incluindo cenarios emGetTableeGetMappingViewnoTestMappingCache.pas(#75)
Changed
ROADMAP.mdnormalizado para refletir o estado consolidado pos-R16.3 e registrar a decisao de continuidade do ciclo (#75)
v2.18.14 — 2026-04-07
Changed
- Refatoração interna do caminho RTTI/cache:
TObjectHelper(GetTable,GetSequence,GetNotServerUse) passou a consumirTMappingExplorercom reaproveitamento de cache, mantendo API pública e itens fora de escopo inalterados (#74)
v2.18.13 — 2026-04-07
Changed
- Registro da decisao pos-R16.2 em R16.1 com gate explicito: go abre R16.3 via
/task; no-go encerra oficialmente o ciclo (#71)
v2.18.12 — 2026-04-07
Changed
- Publicacao da demanda candidata R16.2 reforcada em R16.1 com alinhamento entre
esp.md,adr.md,plan.mdetask-input.mdcomo fonte unica da verdade para abertura imediata via/task(#69)
v2.18.11 — 2026-04-07
Changed
- Confirmacao operacional da R16.2 como proxima demanda oficial no
ROADMAP.md, com handoff final registrado para abertura imediata via/task(#67)
v2.18.10 — 2026-04-07
Added
- Publicacao da demanda candidata R16.2 no roadmap com objetivo, escopo e criterios de aceite fechados para abertura imediata via
/task(#65)
v2.18.9 — 2026-04-07
Added
- Gate decisorio go/no-go formalizado na fase R16.1 para decidir continuidade ou encerramento do ciclo de forma rastreavel (#63)
v2.18.8 — 2026-04-07
Added
- Formalização da demanda R16.1 com classificação ESP-002, especificação arquitetural e critérios de aceite auditáveis para pipeline (#61)
v2.18.7 — 2026-04-07
Fixed
- Saneamento operacional de contaminacao de branch/worktree para reexecucao limpa de review, com isolamento nao destrutivo de alteracoes externas e trilha de evidencias do pipeline (#59).
v2.18.6 — 2026-04-06
Changed
- Conclusão da R15.6 com remoção definitiva do legado
Source/Criteria/*.pase hardening do caminho oficial FluentSQL, incluindo atualização dos consumidores e documentação ativa (#53).
Fixed
- Desbloqueio da regressão crítica do runner
Test/Delphi/JanusSmoke.dpr, com compilação validada sem erros fatais e execução smoke com 112/112 testes aprovados (#55).
v2.18.5 — 2026-04-06
Changed
- Correção da documentação pós-migração para API tipada atual (
Janus.Query.ResultSet,IJanusQueryResultSet,IJanusQueryObject<M>,TJanusQueryObject<M>.NeweTCQ()), removendo referências legadas no portal Docusaurus (#50) - Registro formal no implement-report da validação de contrato de
Janus.Query.ResultSet.pas, auditoria do DLL Bridge e catalogação dos 4 arquivosSource/Criteria/como código morto candidato à remoção em R15.6 (#50)
v2.18.4 — 2026-04-06
Changed
- Limpeza final de vestígios de nomenclatura/caminhos Criteria em exemplos Delphi ativos, concluindo a fatia R15.5 da migração para FluentSQL (#46)
- Relatório de implementação da issue #46 normalizado para refletir evidências finais e caveats de forma consistente (#46)
v2.18.3 — 2026-04-06
Added
- Cobertura DUnitX ampliada no caminho runtime DataSet/Command/Generator com novos cenários em
TestDMLGenerator.pase baseline de drivers emTestFluentSQLIntegration.pas(#44)
Fixed
- Formalização da evidência de placeholders
:camposem aspas em cenários multi-coluna/multi-campo, consolidando o encerramento técnico da dívida da issue #43 no contexto da R15.3 (#44)
v2.18.2 — 2026-04-05
Fixed
- Core DML: correção de regressão para preservar placeholders de bind sem aspas em INSERT/UPDATE no gerador SQL FluentSQL (#42)
v2.18.1 — 2026-04-05
Changed
ROADMAP.mdatualizado com o programa de migração Criteria -> FluentSQL em 6 fatias (R15.1..R15.6), com escopo e metas por etapa (#40)
v2.18.0 — 2026-04-05
Added
- 37 novos testes DUnitX — Expansão massiva da cobertura de testes automatizados (#35)
TestCriteriaAdvanced.pas— 11 testes para Criteria API avançada (AND/OR, LIKE, IN, BETWEEN, OrderBy multi-campo, GroupBy, IS NULL)TestCrudEndToEnd.pas— 8 testes para fluxos CRUD end-to-end via mocksTestPluginIntegration.pas— 6 testes para Plugin System em cenário de integraçãoTestCodeGenComplex.pas— 6 testes para CodeGen com schemas complexos (FKs compostas, múltiplos indexes/checks)TestMiddlewarePipeline.pas— 6 testes para middleware pipeline Before/After (Update, Delete, chain order)
- CI Pipeline —
.github/workflows/tests.ymlcom self-hosted runner placeholder para execução automatizada (#35) - Total de testes: 131 (103 DUnitX + 28 FPCUnit) (#35)
Changed
JanusSmoke.dpr— 5 novas units de teste registradas na cláusula uses (#35)ROADMAP.md— SPRINT-14 marcado como concluído (#35)
v2.17.0 — 2026-04-05
Added
- CodeGen: Indexe/Check attributes — Geração automática de atributos
[Indexe(...)]e[Check(...)]no CodeGen Engine a partir de metadados do banco de dados (#33) TIndexInfoeTCheckInfo— Novos records emJanus.CodeGen.Types.paspara representar índices e check constraints (#33)GetIndexeseGetChecks— Novos métodos emIJanusSchemaReadercom implementação FireDAC viaTFDMetaInfoQuery(#33)_BuildIndexAttributese_BuildCheckAttributes— Builders noTJanusCodeGenEnginepara geração de atributos a partir de dados reais (#33)- 6 testes DUnitX — Cobertura de cenários: sem índices, índice simples, composto, unique, check constraint, combinações múltiplas (#33)
Changed
GenerateUnitagora substitui placeholders{{IndexAttributes}}e{{CheckAttributes}}com dados reais do schema reader (#33)- Índices de PK são filtrados automaticamente para não gerar
[Indexe]redundante (#33)
v2.16.0 — 2026-04-05
Added
- README bilíngue —
README.en.mdcom tradução completa e feature matrix; link para versão EN adicionado aoREADME.md(#31) - Guia Getting Started —
Doc/GETTING-STARTED.mdcom tutorial "Do zero ao primeiro CRUD" (#31) - Guia de Arquitetura —
Doc/ARCHITECTURE.mdcom camadas do framework e referências a units reais (#31) - Guia de Migração —
Doc/MIGRATION-ORMBR.mdcom mapeamento de renomeações ORMBr → Janus (#31) - Tutorial Plugin System —
Doc/PLUGINS.mdcom tutorial hands-on de IJanusPlugin e TPluginRegistry (#31) - Tutorial CodeGen —
Doc/CODEGEN.mdcom tutorial hands-on do CodeGen Engine e IDE Wizard (#31) - Help Online — 4 novos artigos HTML: LazyLoading, PluginSystem, CodeGenWizard, RecursosAvancados (#31)
- Keywords —
_keywords.jsonpopulado com 49 keywords para busca no Help Online (#31)
Changed
README.md— reestruturado com feature matrix e simplificação de conteúdo (#31)ROADMAP.md— SPRINT-13 marcado como concluído, SPRINT-14 adicionado (#31)_toc.json— 4 novas entradas de navegação para artigos avançados (#31)
v2.15.0 — 2026-04-05
Added
- CodeGen Library — 5 novas units em
Source/CodeGen/para geração de modelos Delphi a partir de schema de banco (#29) IJanusSchemaReader— Interface de leitura de schema com implementação FireDACTFireDACSchemaReader(#29)TJanusCodeGenEngine— Motor de geração que consome schema reader + options e produz units completas com atributos, FK, nullable, lazy (#29)TJanusCodeTemplate— Sistema de templates com placeholders{{...}}e template padrão de unit (#29)TJanusCodeGenOptions— Opções de geração com persistência INI (#29)- IDE Wizard —
JanusWizard.dpkcomTJanusModelWizard(IOTAWizard + IOTAMenuWizard) e wizard de 4 páginas (#29) - 21 novos testes DUnitX em
TestCodeGenEngineeTestCodeGenTemplate(total 60 testes) (#29)
Changed
Frm_Principal.pas(standalone generator) refatorado para consumirJanus.CodeGen.*em vez de lógica inline — preview ao clicar tabela (#29)JanusGeneratorModel.dpratualizado com referências aos 5 CodeGen units (#29)Connection.xml— todas as referências ORMBr substituídas por Janus (#29)Janus.Reg.pas— cabeçalho de licença atualizado de "ORM Brasil" para "Janus Framework" (#29)
v2.14.0 — 2026-04-04
Added
IJanusPlugin+IJanusPluginInfo— contrato formal de plugin com lifecycle (Init,Finalize,GetPluginInfo,Enabled) (#27)IJanusHookContext+TJanusHookContext— contexto rico para hooks de persistência (operação, classe, entidade, abort flag, metadata bag) (#27)TPluginRegistry— registro central de plugins comRegister/Unregister/Enable/Disable(#27)EJanusPluginException— exceção dedicada para erros do sistema de plugins (#27)- Overloads com
TProc<IJanusHookContext>e prioridade em todos os 6 middlewares de evento (#27) - Custom Events:
RegisterCustomEvent/ExecuteCustomEventcom proteção contra nomes reservados (#27) - Abort/Cancel em hooks Before*:
IJanusHookContext.Abortimpede a operação; em After* lançaEJanusPluginException(#27) onCustomadicionado ao enumTJanusEventTypepara suporte a custom events (#27)- 10 novos testes DUnitX em
TestPluginRegistry(total 39 testes) (#27)
Changed
TSessionAbstract<M>.Insert/Update/Deleteagora criamIJanusHookContexte executam hooks Before*/After* com contexto e abort (#27)- Assinaturas legadas (
TProc<TObject>) marcadas comodeprecatednos 6 middlewares de evento (#27)
v2.13.0 — 2026-04-04
Added
- Lazy loading transparente no contexto DataSet: scroll pelo dataset pai injeta proxies automaticamente sem
LoadLazyexplícito (#25) OpenDataSetChildsseletivo: filhos comAssociation.Lazy=Truenão são abertos eagerly no scroll (#25)- PK tracking (
FLastPKValue) e guard (FProxiesInjectedForCurrentRow) noTDataSetBaseAdapter<M>(#25) - Método
_InjectLazyProxiesOnScrollchamado noDoAfterScroll(#25) - Método
_GetCurrentPKAsStringpara PK simples e composta (#25) - Guard em
Current()contra dupla injeção de proxies (#25) - 6 novos testes DUnitX em
TestDataSetAutoLazy(total 29 testes) (#25)
Changed
PLAN_LOAD_LAZY.md: FASE 3 (DataSet Auto-Lazy on Scroll) marcada como concluída (#25)
v2.12.1 — 2026-04-04
Added
ILazySessionToken+TLazySessionToken+ELazyLoadExceptionpara proxy lifetime safety (#22)ILazyProxyResettable.Resetpara reutilizar proxies em scrolls repetidos sem novas alocações (#22)FillAssociationrecursivo nas closures do proxy lazy (sub-associações do child populadas automaticamente) (#22)- Guard contra recursão infinita via
TList<Pointer>de objetos já processados (#22) TQueryCache.Clearcom contrato de crescimento bounded documentado (#22)- 4 novos testes DUnitX:
TestLazyProxy_InvalidSession,TestLazyProxy_RecursiveFill,TestLazyProxy_SkipReinjection,TestQueryCache_Clear(#22)
Fixed
- Proxy lazy agora lança
ELazyLoadExceptionquando session é destruída antes da invocação (em vez de Access Violation) (#22)
Changed
boss.json: removidas 4 dependências mortas (hashload/*→ 404) (#22)
v2.12.0 — 2026-04-04
Added
- Proxy transparente para lazy loading: acessar
Owner.Childdispara SQL automaticamente semLoadLazy<T>explícito (#20) TLazyMappingExplorer— cache singleton de campos lazy por classe, evitando re-iteração RTTI (#20)_InjectLazyFactoryno executor: injeta closures com contexto de banco em fieldsLazy<T>(#20)InjectLazyProxies/InjectLazyFactoriespara contexto DataSet (#20)- Overload
GetDictionary(ADictionary)para pré-extração em loop único (#20) - 8 novos testes DUnitX:
TestLazyMapping(4),TestLazyProxy(3),TestGetDictionary(1) (#20)
Changed
FillAssociationagora injeta factory proxy em vez deContinuepara campos lazy (#20)FillAssociationLazyconsultaTLazyMappingExplorer(cache) em vez de iterar atributos (#20)PopularColumn()ePopularCalcField()pré-extraem Dictionary no loop principal, sem re-iteração (#20)
Removed
- Código comentado de
FLazyLoadMappingnoMetaDbDiff.Mapping.Explorer.pas(#20)
v2.11.0 — 2026-04-04
Added
- Projeto DUnitX com 11 smoke tests em
Test/Delphi/(#18)TestMappingCache: 4 testes TMappingExplorer (Table, Column, Association, PrimaryKey)TestRttiSingleton: 2 testes TRttiSingleton (GetRttiType, singleton identity)TestLazyWrapper: 2 testes Lazy<T> (factory implicit operator, default RTTI creation)TestNullable: 3 testes Nullable<T> (HasValue, default, clear)
Changed
Janus.Bind.pas: removidoFContext: TRttiContextduplicado deTBind, delegado aRttiSingleton(#18)Janus.Objects.Helper.pas: 7 métodos refatorados para usarRttiSingletonem vez deTRttiContext.Createlocal (#18)GetTable,GetSequence,GetResource,GetSubResource,GetNotServerUse: usamRttiSingleton.GetRttiTypediretamente&GetType,MethodCall: eliminadoTRttiContext.Createlocal
v2.10.0 — 2026-04-03
Changed
- Reorganização de pastas: exemplos Delphi movidos para
Examples/Delphi/, testes FPCUnit movidos paraTest/Lazarus/(#17) - Separação de
Examples/(demonstrações) eTest/(testes automatizados) por plataforma
Added
CHANGELOG.mdcom histórico completo de versões- Placeholder
Test/Delphi/.gitkeeppara futuros testes DUnit/DUnitX - Engine Zeos migrada para
Test/Lazarus/Engines/Zeos/
v2.9.0 — 2026-04-03
Added
- Bateria de testes FPCUnit para a DLL Bridge do Janus (#16)
- Suites: Strategy1, Strategy2, Criteria, EdgeCases
v2.8.0 — 2026-04-03
Added
- Paginação NextPacket e navegação sequencial (First/Next/Prior/Eof/CurrentRecord) para IJanusObjectSet DLL Bridge (#15)
v2.7.0 — 2026-04-03
Changed
- Refatoração dos exemplos Lazarus para usar a helper layer (#14)
- Atualização do README.md
v2.6.0 — 2026-04-03
Added
- TJanusRecordHelper, TJanusSetHelper, connection wrappers e factories para Lazarus/FPC (#13)
v2.5.0 — 2026-04-03
Added
Janus.Lazarus.Helper.pas— string helper layer para Lazarus/FPC (#12)
Removed
- Executável legado
ORMBrDependencies.exeeRESTFulInstall.ini
v2.4.0 — 2026-04-03
Added
- Relacionamentos programáticos via DLL: FK, JoinColumn, Association (#11)
v2.3.1 — 2026-04-03
Fixed
- Resolução de erro E2010 e migração para API DataEngine v0.2.0 (#10)
v2.3.0 — 2026-04-02
Added
- Strategy 2: Mapeamento Programático via IJanusEntityBuilder (#9)
v2.2.0 — 2026-04-02
Added
- ConnectMSSQL, ConnectOracle e IJanusCriteria via DLL (#8)
v2.1.0 — 2026-04-02
Added
- Exposição do Janus ORM via DLL Windows com interfaces COM-compatíveis (#7)
v2.0.1 — 2026-04-02
Fixed
- Correções no JanusDependencies: double-backslash, HRESULT, try/except, ModalResult, ALog global, URL por tag e renomeação de recursos (#6)
v2.0.0 — 2026-04-01
Changed
- Renomeação do framework: ORMBr → Janus (#5)
- Canonização de nomenclatura em todo o framework
- Bump de versão para 2.0.0 (breaking change por renomeação)
Histórico pré-Janus (ORMBr)
As versões abaixo referem-se ao projeto sob o nome original ORMBr, antes da renomeação para Janus.
Destaques do legado ORMBr (pré-v2.0.0)
- Middleware Horse: integração com framework Horse para APIs REST
- Middleware de eventos: BeforeInsert, AfterInsert, BeforeUpdate, AfterUpdate, BeforeDelete, AfterDelete
- Monitor de comandos: callback no Factory do Connection para rastrear comandos e params
- Cache de SQL: correção de bug que impedia cache de comandos SQL gerados
- ORMBr LiveBindings: suporte a VCL e FMX com correções de AV
- MongoDB: driver de acesso via engine MongoWire
- TManagerDataSet / TManagerObjectSet: uso simplificado dos recursos do ORM
- SubResource: atributo para uso do REST API
- NextPacket: aprimoramento para atender OpenWhere() e FindWhere()
- Metadata Compare: comparação Model ↔ DB com geração de DDL
- Suporte multi-banco: Firebird, InterBase, SQLite, MySQL, PostgreSQL, MSSQL, Oracle, MongoDB, ADS, AbsoluteDB, ElevateDB, NexusDB
- Gerador de Modelos: contribuição da comunidade
- Nullable/Blob/Lazy: tipos avançados para mapeamento