jocaagura_domain 1.35.0
jocaagura_domain: ^1.35.0 copied to clipboard
A package with domain models for all transversal applications
CHANGELOG Jocaagura Domain #
This document follows the guidelines of Keep a Changelog, and this project adheres to Semantic Versioning.
1.35.0 - 2025-12-18 #
Added #
- Added
ModelCompleteFlow, a new immutable domain model to represent a complete deterministic diagram composed of multipleModelFlowStepitems. - Added
CompleteFlowEnumto guarantee stable JSON keys viaenum.nameforModelCompleteFlow. - Added
defaultModelCompleteFlowas a safe fallback/testing instance.
Features #
-
Implemented canonical Map-based storage and JSON contract:
stepsByIndex(Map<int, ModelFlowStep>), serialized as a JSON map keyed by step index as string (e.g.,"10"). -
Implemented deterministic, roundtrip-safe JSON serialization/deserialization:
- Defensive parsing using
Utils.*FromDynamic. - Stable emission order using
stepsSorted(sorted by index). - Lenient
fromJsonthat never throws and applies safe defaults.
- Defensive parsing using
Immutability #
-
Ensured deep immutability:
stepsByIndexis stored asMap<int, ModelFlowStep>.unmodifiable.- Inserted/updated steps are normalized through
ModelCompleteFlow.asImmutableStep(...)(internally leveragingModelFlowStep.immutable).
Helpers #
-
Added ergonomic helpers for diagram manipulation (immutable copy semantics):
stepsSortedfor stable UI/export ordering.entryIndexto determine the diagram entry point (smallest index, or-1if empty).stepAt(int index)to retrieve a step by index.upsertStep(ModelFlowStep step)to insert/update bystep.index.removeStepAt(int index)andremoveStep(ModelFlowStep step)to delete steps.
Behavior and Contracts #
-
Enforced END semantics:
- Steps with
index < 0(including-1) are ignored and not stored. index == -1remains reserved exclusively as an END target for routing.
- Steps with
Equality & Hashing #
-
Added value-based equality and hashing for
ModelCompleteFlow:operator ==comparesname,description, and deep equality forstepsByIndexviaUtils.deepEqualsDynamic.hashCodeusesObject.hash(...)plusUtils.deepHash(stepsByIndex).
Documentation #
- Added comprehensive DartDoc to
ModelCompleteFlowincluding usage guidance, immutability guarantees, JSON contract shape, and an executablemain()example.
Tests #
-
Added unit tests for
ModelCompleteFlowcovering:- Map-based JSON roundtrip (toJson/fromJson).
- END semantics (
index < 0ignored). - Deep immutability (unmodifiable collections).
copyWith()returning the same instance when no changes are requested.upsertStep/removeStepAtbehaviors (including no-op returningthis).entryIndex,stepsSorted, andhashCodeconsistency.
1.34.0 - 2025-12-08 #
Release acumulada. Consolida los cambios de 1.33.1 → 1.33.3 sin adiciones extra.
Enfoque: estabilización de contratos, helpers de pruebas HTTP y consistencia en serialización.
Added #
- HTTP – Testing helpers
- Helper estandarizado para respuestas enlatadas (canned) en flujos
GET/POST/PUT/DELETE. - Escenarios simulados:
Timeout,Offline,Unexpected error,Bad JSON.
- Helper estandarizado para respuestas enlatadas (canned) en flujos
Changed #
- HTTP – Simulación y normalización
- Refactor para unificar el esquema de respuestas enlatadas y simplificar el cableado de pruebas.
- Normalización de
raw response(status/headers/body) antes del mapeo de éxito/error.
Fixed #
- Domain – ModelAppVersion
buildAtahora se persiste como cadena ISO-8601 UTC (centinelakDefaultBuildAtIso) y exponebuildAtDateTimecomo getter. Esto permite instanciasconsty evita drift entre plataformas.
- Bloc – BlocHttpRequest
- Estabilizado el contrato para garantizar la herencia correcta de
BlocModule.
- Estabilizado el contrato para garantizar la herencia correcta de
Docs #
- Comentarios y notas aclarando:
- El flujo
buildAt(string ISO + getter). - Uso de helpers en pruebas HTTP y normalización previa al mapper.
- El flujo
Tests #
- Suites ampliadas para cubrir:
- Escenarios HTTP simulados (timeout/offline/unexpected/bad-JSON).
- Verificación de normalización previa al mapeo.
- Casos de
ModelAppVersion(ISO string + getterbuildAtDateTime).
Migration notes #
- HTTP tests: reemplaza fixtures ad-hoc por el helper de respuestas enlatadas; ajusta aserciones si dependían del formato previo (especialmente en
headers/bodynormalizados). - ModelAppVersion: si consumías
buildAtcomoDateTimedirecto, usa el string ISO almacenado o el getterbuildAtDateTimepara conversión. - BlocHttpRequest: sin cambios de API pública; la corrección asegura tipado y ciclo de vida coherentes con
BlocModule.
1.33.3 - 2025-12-08 #
Added #
- HTTP testing helpers
- Helper estandarizado para respuestas enlatadas (canned) en flujos HTTP, facilitando la
creación de fixtures repetibles para
GET/POST/PUT/DELETE. - Escenarios simulados adicionales:
- Timeout
- Offline (sin conectividad)
- Unexpected error (excepción no mapeada)
- Bad JSON (payload no parseable)
- Helper estandarizado para respuestas enlatadas (canned) en flujos HTTP, facilitando la
creación de fixtures repetibles para
Changed #
- Simulación HTTP: refactor para unificar el esquema de respuestas enlatadas y simplificar el cableado de pruebas.
- Normalización del raw response (status, headers, body) antes de pasar por el mapper de errores/éxitos, reduciendo casos borde de serialización y aserciones frágiles en tests.
Tests #
- Suites ampliadas para cubrir los nuevos escenarios (timeout/offline/unexpected/bad-JSON),
verificando:
- Normalización del raw response previa al mapeo.
- Comportamiento consistente de los mappers de error del proyecto.
- Idempotencia de los fixtures con respuestas enlatadas.
Migration notes #
- Sustituye fixtures o mocks ad-hoc por el helper de respuestas enlatadas para reducir duplicación y hacer las pruebas más declarativas.
- Si tus pruebas dependían del formato previo del raw response, ajusta aserciones a la
nueva normalización (especialmente en
headersybody).
1.33.2 - 2025-12-07 #
Fixed #
- hotfix para estabilizar el contrato de BlocHttpRequest para garantizar la correcta herencia de BlocModule.
1.33.1 - 2025-12-07 #
Fixed #
- Hotfix para estabilizar el contrato de
ModelAppVersional serializarbuildAty permitirdefaultModelAppVersiontotalmente constante.
Fixed #
ModelAppVersionahora persistebuildAtcomo cadena ISO-8601 UTC conkDefaultBuildAtIso(07 Dic 2025) como valor por defecto, evitando drift entre plataformas y habilitando instancias const en tree-shaking.- Se agregó el getter
buildAtDateTimeque utilizaDateUtilspara exponer el valor enDateTimesin sacrificar el almacenamiento en texto.
Docs #
- Comentarios del modelo aclaran el nuevo flujo (
buildAtstring + getter) y el uso delhotfixpara pipelines de lanzamiento.
Tests #
test/domain/apps/model_app_version_test.dartactualizado para validar la cadena ISO, el getterbuildAtDateTimey el valor centinelakDefaultBuildAtIso.
1.33.0 - 2025-11-25 #
Versión acumulada que integra las entregas 1.32.2 (ecosistema de Grupos + auditoría CRUD) y 1.32.1 (stack HTTP transversal). No añade funcionalidades extra fuera de lo ya incluido.
Added #
- Ecosistema de Grupos
ModelGroup,ModelGroupMember,ModelGroupAlias,ModelGroupDynamicMembershipRule.ModelGroupConfig/ModelGroupSettings,ModelGroupSyncConfig,ModelGroupSyncJob,ModelGroupLabels.- Enfoque común: claves JSON con enums,
fromJsonrobusto,copyWith, e igualdad por valor.
- Auditoría CRUD
ModelCrudMetadata(created/updated/deleted, actores,version) con helpers:initialize,touchOnUpdate,markDeleted.ModelCrudLogEntry(entidad, operación, actor, fecha,diff/envopcionales).
- Stack HTTP transversal (dominio)
- Modelos:
ModelConfigHttpRequest,StateHttpRequest,ModelTraceHttpRequest. - Contratos:
AdapterHttpClient,ServiceHttpRequest,GatewayHttpRequest(never-throws),RepositoryHttpRequest. - Implementaciones:
GatewayHttpRequestImpl,RepositoryHttpRequestImpl,FakeHttpRequest/FakeHttpRequestConfig. - Use cases: GET/POST/PUT/DELETE,
retry; facadeFacadeHttpRequestUsecases. - BLoC:
BlocHttpRequestconSet<String>de peticiones activas. - Error mapping:
DefaultHttpErrorMapper(mapeaTimeoutException→HTTP_TIMEOUT, añademeta.transport='http', ajustacodesegúnstatusCode/httpStatus).
- Modelos:
- Utils
enumFromJson<T>(),stringListFromDynamic().
Changed #
- Auth:
GatewayAuthImplusaDefaultHttpErrorMapperpara enriquecer errores basados en HTTP. - Repository HTTP:
RepositoryHttpRequestImplexponenormalizeBody(mejor testabilidad).
Removed #
- Exports del dominio: se retiran
HelperHttpRequestIdyModelResponseHttpRaw(obsoletos en la API vigente).
Docs #
- Modelos de Grupos y Auditoría CRUD: propósito, contratos JSON, ejemplos ejecutables.
- Stack HTTP: guía y ejemplo
bloc_http_request_example.dart; aclaraciones de nulabilidad enModelConfigHttpRequest.
Tests #
- Grupos: baterías por modelo (round-trip JSON,
copyWith, igualdad, campos faltantes/ inválidos). - CRUD:
model_crud_metadata_test.dart,model_crud_log_entry_test.dart. - HTTP: cobertura amplia (BLoC, Gateway, Repository, Fake service, ErrorMapper,
ModelConfigHttpRequest).
Migration notes #
- HTTP errors: si la UI depende de
code/meta, contempla nuevos códigos estándar (HTTP_TIMEOUT,HTTP_UNAUTHORIZED, etc.) ymeta.transport='http'. - Imports: si consumías
HelperHttpRequestIdoModelResponseHttpRawdesde el barrel, elimina esos imports o sustituye por utilidades vigentes. - Auditoría: adopta
ModelCrudMetadataembebido en entidades y registra eventos transversales conModelCrudLogEntry.
Notas: Cambios no rompientes (salvo limpieza de exports). Los módulos son opt-in y compatibles con Firestore/JSON.
1.32.2 - 2025-11-24 #
Added #
- Domain – Ecosistema de Grupos
ModelGroup: entidad núcleo con estado, labels y metadatos.ModelGroupMember: relación miembro–grupo (rol, tipo de entidad, suscripción) con validación básica de correos.ModelGroupAlias: alias de correo con estado de provisioning y errores.ModelGroupConfig/ModelGroupSettings: configuración técnica y de proveedor (e.g., Google Groups) y estado de sincronización.ModelGroupDynamicMembershipRule: reglas de membresía dinámica.ModelGroupSyncConfig: estrategia de sincronización desde fuentes externas (sheets/courses).ModelGroupSyncJob: historial de ejecuciones (timestamps, contadores de cambios, uso de API).ModelGroupLabels: garantizatagscomoList<String>no nula.- Comportamiento compartido: claves JSON respaldadas por enums,
fromJsonrobustos con fallbacks,copyWith, e igualdad por valor (==/hashCode).
- Auditoría CRUD
ModelCrudMetadata: metadatos de auditoría por registro (created/updated/deleted, actor/es,version) confromJson/toJson,copyWithe helpers estáticos:initialize,touchOnUpdate,markDeleted.ModelCrudLogEntry: registro de operación CRUD (tipo/entidad/actor/fecha) condiff/envopcionales;copyWithy serialización robusta.
- Utils
enumFromJson<T>(): parseo seguro de enums con fallback.stringListFromDynamic(): normalización de entradas dinámicas aList<String>.
Docs #
- Documentación de modelos y enums nuevos: propósito, contratos JSON y ejemplos ejecutables.
Tests #
- Grupos: baterías para cada modelo (
model_group*_test.dart, etc.) con round-trips JSON,copyWith, contratos de igualdad y manejo de campos faltantes/ inválidos. - CRUD:
model_crud_metadata_test.dart,model_crud_log_entry_test.dart(JSON round-trip,copyWith, helpers de ciclo de vida). - Utils: pruebas de
enumFromJsonystringListFromDynamic.
Notes #
- Sin cambios rompientes previstos. Los nuevos modelos son opt-in y compatibles con Firestore/JSON.
- Se recomienda estandarizar auditoría usando
ModelCrudMetadataanidado en las entidades y registrar eventos transversales conModelCrudLogEntry.
1.32.1 - 2025-11-18 #
Added #
-
HTTP transversal (dominio)
- Modelos (
domain/http):ModelConfigHttpRequest(config inmutable, round-trip JSON).StateHttpRequest(ciclo:Created/Running/Success/Failure/Cancelled).ModelTraceHttpRequest(traza en memoria para depuración/telemetría).
- Contratos:
AdapterHttpClient(cliente bajo nivel).ServiceHttpRequest,GatewayHttpRequest(never-throws conErrorItem).RepositoryHttpRequest(retornaModelConfigHttpRequesten éxito).
- Implementaciones:
GatewayHttpRequestImpl,RepositoryHttpRequestImpl.FakeHttpRequest/FakeHttpRequestConfig(latencia, errores forzados, respuestas enlatadas).
- Use cases (
domain/usecases/http_request):- GET/POST/PUT/DELETE y
retry, másFacadeHttpRequestUsecases.
- GET/POST/PUT/DELETE y
- BLoC (
domain/blocs):BlocHttpRequestconSet<String>de peticiones activas para reaccionar en UI.
- Enums/helpers:
HttpMethodEnum,HttpRequestLifecycleEnum,HttpRequestFailureEnum.
- Modelos (
-
Ejemplo end-to-end
bloc_http_request_example.dart: cableado completo Service → Gateway → Repository → Usecases → Facade → BlocHttpRequest, ejecutando GET/POST/DELETE, mostrando set de activas y resultado (ErrorItem/ModelConfigHttpRequest).
-
Error mapping especializado
DefaultHttpErrorMapper:- Envuelve
DefaultErrorMapper. - Mapea
TimeoutException→HTTP_TIMEOUT. - Añade
transport: 'http'ameta. - Ajusta
codecon base enstatusCode/httpStatus(p.ej. 401 →HTTP_UNAUTHORIZED).
- Envuelve
Changed #
GatewayAuthImplahora usaDefaultHttpErrorMapperpara enriquecer los errores de autenticación basados en HTTP.RepositoryHttpRequestImplexponenormalizeBody(mejor testabilidad).- DartDoc de
ModelConfigHttpRequest: contratos de nulabilidad deheadersybodyaclarados.
Removed #
- Exports del dominio: se retiran
HelperHttpRequestIdyModelResponseHttpRawpor no uso en la API actual.
Tests #
- Cobertura amplia de todo el stack HTTP:
BlocHttpRequest: seguimiento de activas, concurrencia,retry, emisiones de stream.GatewayHttpRequestImpl: adaptación de metadatos, transformación de cuerpo, mapeo de errores.RepositoryHttpRequestImpl: delegación y construcción de configuración.FakeHttpRequest: respuestas enlatadas, eco, latencia y errores inyectados.DefaultHttpErrorMapper: excepciones y payloads →ErrorItemconmetacorrecto.ModelConfigHttpRequest: round-trip JSON, valores por defecto,copyWith.
Migration notes #
- Error mapping: si tu UI/presenters dependen de
code/meta, revisa casos deTimeoutExceptiony errores 4xx/5xx (ahora vienen con códigos HTTP explícitos ymeta.transport='http'). - Exports eliminados: si importabas
HelperHttpRequestIdoModelResponseHttpRawdesde el barrel, migra a utilidades propias o a los modelos vigentes. (No afecta a la ruta estándar del flujo.) normalizeBodydisponible públicamente enRepositoryHttpRequestImplpara pruebas finas.
Notas: La versión introduce el stack HTTP transversal con ejemplo listo para copiar, mejora el mapeo de errores y eleva la cobertura de pruebas. Cambios no rompientes salvo posibles imports a símbolos retirados del barrel.
1.32.0 - 2025-10-19 #
Publicación acumulada que consolida los cambios de 1.31.0 → 1.31.3. No introduce cambios funcionales nuevos; sincroniza documentación, ejemplos y exports del paquete.
Included from 1.31.3 (2025-10-19) #
Added
- Parsers de atributos:
AttributeModel.listFromDynamicTyped<T>(input, fromJsonT)(parseo tipado desde JSON/String o dinámico; raízIterable; sólo objetos; omite fallas sin lanzar).AttributeModel.listFromDynamicShallow(input)(parseo superficial con filtroisDomainCompatible).- Listas retornadas mutables (puede cambiar a
List.unmodifiableen futuras versiones).
- Educación: nuevos modelos (
CompetencyStandard,LearningGoal,PerformanceIndicator,AchievementTriple,LearningItem,Assessment) y enums (ActorRole,ContentState,PerformanceLevel). Ejemplo runnableeducation_base_project.dart.
Changed
ModelLearningGoalconLearningGoalEnum,extends Model,fromJsonrobusto,copyWith,==/hashCode,standardanidado como objeto (fallback adefaultCompetencyStandard).- Rediseño evaluación:
ModelAssessment extends Model+AssessmentEnum,timeLimit: Duration(ms viatimeLimitMs),itemsinmutable.ModelLearningItem extends Model+LearningItemEnum;wrongAnswers: List<String>→wrongAnswerOne/Two/Three;achievements→achievementOne(req.),achievementTwo/Three( opt.).
Docs/Tests
- DartDoc exhaustivo de parsers y modelos; suites con round-trip, defaults, assertions, determinismo e inmutabilidad de listas.
Breaking (recordatorio)
ModelLearningGoal.standardserializa como objeto bajo"standard".ModelLearningItemcambia forma JSON; ver 1.31.3 para guía de migración.
Included from 1.31.2 (2025-10-18) #
Added
ModelItem(id/name/description/type: ModelCategory/price: ModelPrice/attributes) con fallback deid.ModelPrice(mathPrecision,CurrencyEnum,decimalAmount).ModelCategory(+ enum) con slug normalizado y==/hashCodepor categoría canónica.ModelAttribute<T>(aliasAttributeModel<T>) con helperfrom<T>()y validación de tipos soportados.- Demo end‑to‑end (Store) single‑file sin dependencias externas, precisión financiera alineada con
ModelPrice.
Tests
model_item_test.dart,model_price_test.dart,attribute_model_test.dart,model_category_test.dart.
Notes
- Modelos inmutables, serializables y compatibles con Firestore. Sin cambios rompientes.
Included from 1.31.1 (2025-10-18) #
Docs
Bloc/extensión: semántica seeded stream y contratos de ciclo de vida (sin historial/backpressure;add/valuetrasdispose()lanza). Ejemplos ejecutables; alineación entrebloc.dartyentity_bloc.dart.
Documentación únicamente. Sin cambios de API.
Included from 1.31.0 (2025-10-13) #
Resumen
- Consolidación de sesión, WS DB JSON‑first y utils con ejemplos y suites de pruebas ( ver release 1.31.0 para detalle y notas de migración de WS DB).
Migration notes #
- Esta versión no añade nuevas migraciones. Aplican las ya documentadas en 1.31.3 ( educación) y 1.31.0 (WS DB renombres/contrato JSON‑first).
Housekeeping #
- Sincronización de
README/DartDocy ejemplos; verificación de exports en el barrel público.
1.31.3 - 2025-10-19 #
Added #
- Domain/Model – Parsers de atributos tipados y superficiales
AttributeModel.listFromDynamicTyped<T>(input, fromJsonT): parseo tipado desdeString( JSON) o entrada dinámica; decodifica, exige raízIterable, incluye solo objetos{String,dynamic}, aplica convertidorfromJsonT, y salta fallas sin lanzar.AttributeModel.listFromDynamicShallow(input): parseo shallow delegando enUtils.listFromDynamicy filtrando por compatibilidad de dominio.- Comportamientos clave:
- Faltante
"name"→''(vacío). - Entradas no objeto en arrays JSON → ignoradas.
- Entradas no-
String→ ramaUtils. - Guard superficial: incluir únicamente valores que pasen
isDomainCompatible. - Listas retornadas son mutables (posible cambio futuro a
List.unmodifiable).
- Faltante
- Domain/Education – Nueva base curricular y evaluaciones
- Modelos:
CompetencyStandard,LearningGoal,PerformanceIndicator,AchievementTriple,LearningItem,Assessment. - Enums de soporte:
ActorRole,ContentState,PerformanceLevel. - Ejemplo runnable:
education_base_project.dartcon jerarquía completa hastaAssessment.
- Modelos:
Changed #
- Education –
ModelLearningGoalLearningGoalEnumpara claves JSON estables.ModelLearningGoal extends ModelconfromJsonrobusto (utilidadesUtils.*),copyWith,==/hashCode,toString()→ JSON, y precondiciónversion > 0.- Anidado
standardcomo objeto completo (usadefaultCompetencyStandardsi falta).
- Education – Rediseño de evaluación y reactivos asociados
ModelAssessment extends ModelconAssessmentEnum;timeLimit: Duration→ serializa en **ms ** (timeLimitMs); listaitemsinmutable;defaultModelAssessment.ModelLearningItem extends ModelconLearningItemEnum:wrongAnswers: List<String>→ camposwrongAnswerOne/Two/Three.achievements: List<ModelPerformanceIndicator>→ tripleachievementOne(req.),achievementTwo/Three(opt.).attributesinmutables,optionsShuffled([seed]),copyWith,==/hashCode.
Docs #
- Attribute parsers: DartDoc exhaustivo para
listFromDynamicTyped<T>(entradas aceptadas, conversión, shallow checks, claves faltantes, manejo de errores, orden, ejemplo runnable y limitaciones). - Education: documentación de modelos y demo de evaluación (sumas/restas 3°) basada en
jocaagura_domain.
Tests #
- Atributos
attribute_model_list_typed_test.dart: conversiónintdesdeString,DateTimeISO8601, JSON inválido/objeto→vacío, ramaUtilspara no-String,"name"faltante→'', convertidor que lanza→salta ítem, tipo no compatible→omitido,Iterableexplícito, ignora elementos no objeto.attribute_model_list_shallow_test.dart: preserva heterogeneidad, JSON inválido/objeto→vacío,"name"faltante→'', valor no compatible→omitido,null→vacío, ignora no-objeto.
- Education
ModelLearningGoal: round-trip,copyWith, defaults (incluyestandard),standardcomoStringJSON→Utils.mapFromDynamic, aserciónversion <= 0falla, igualdad/hash,toString()parseable con claves enum.CompetencyStandard: round-trip,copyWith, defaults.Assessment/LearningItem: round-trip, Durations en ms, determinismo deoptionsShuffled, listas inmutables.
1.31.2 - 2025-10-18 #
Added #
- Domain – Productos y precios
ModelItem: entidad mínima y extensible (id, name, description,type: ModelCategory,price: ModelPrice,attributesdinámicos).- Lógica fallback de
idcuando viene vacío (usacategorynormalizada).
- Lógica fallback de
ModelPrice: valor monetario conmathPrecision,CurrencyEnum(COP, USD, MXN, …) ydecimalAmountpara conversión precisa.- Constantes:
defaultModelItem,defaultModelPrice.
- Taxonomía
ModelCategory(+ModelCategoryEnum): modelo inmutable con slug canónico.- API pública:
fromJson,toJson,copyWith,normalizeCategory(String). - Igualdad/
hashCodebasados solo encategorynormalizada.
- API pública:
- Atributos tipados
ModelAttribute<T>(alias deAttributeModel<T>): atributos genéricos compatibles con Firestore (tipos soportados).- Helper
ModelAttribute.from<T>()para construcción tipada con validación.
- Helper
- Demo end-to-end (Store)
- Ejemplo single-file listo para copiar (sin paquetes externos) mostrando:
UI → AppManager → Bloc → UseCase → Repository → Gateway → Service
usandoStoreModel,ModelItem,ModelPrice,ModelCategory,FinancialMovementModelyLedgerModel.- Alinea precisión financiera con
ModelPrice(mathPrecision: 2).
- Alinea precisión financiera con
- Ejemplo single-file listo para copiar (sin paquetes externos) mostrando:
Tests
model_item_test.dart: round-trip JSON, fallback deid,copyWith, igualdad/hashCode,toString.model_price_test.dart: matemática decimal, fallback de moneda, round-trip,copyWith.attribute_model_test.dart:from<T>(), seguridad de tipos, round-trip, igualdad.model_category_test.dart: matriz de normalización (espacios/puntuación/caso), round-trip, igualdad basada encategorynormalizada,copyWith,toJson(trim dedescription).
Docs #
- DartDoc en inglés con ejemplo ejecutable para
ModelCategory. - Guía del ejemplo pet store con precisión financiera alineada a
ModelPrice.
Notes #
- Todos los modelos son inmutables y serializables (compatibles con Firestore).
- Sin cambios rompientes: nuevas entidades y helpers son opt-in.
- Si tu lógica dependía del signo de montos para ingreso/egreso, usa el
category/tipo del item en lugar de valores negativos.
1.31.1 - 2025-10-18 #
Docs #
- Bloc / Extension (domain): se clarifica el semántico seed del stream:
Bloc.streames seeded: captura el valor en el momento del getter y **cada suscripción ** recibe primero ese seed y luego las actualizaciones.- Suscripción ansiosa a la fuente, comportamiento broadcast, y notas de ciclo de vida.
- Caso fuente ya completada: el suscriptor se cierra sin emitir el seed.
- Contratos explícitos: pre/postcondiciones documentadas:
- Sin historial ni backpressure; solo el seed actual y eventos futuros.
- Llamar
add/valuetrasdispose()lanza desde el controlador.
- Ejemplos ejecutables: se añaden
void main()de referencia para uso correcto. - Consistencia: DartDoc alineada entre
bloc.dartyentity_bloc.dart(punto de extensión y notas de ciclo de vida).
Notas: Solo documentación. Sin cambios funcionales ni de API.
1.31.0 - 2025-10-13 #
Resumen práctico #
Publicación acumulada que consolida sesión, BD WebSocket JSON-first, y utilidades de dominio con ejemplos listos para copiar. Mejora la testabilidad, clarifica contratos y simplifica la integración en apps nuevas o existentes.
Puntos clave #
- Sesión
BlocSessionahora extiendeBlocModule(ciclo de vida unificado) y expone hooks de efectos secundarios por cambio de estado.- Nuevo
getCurrentUser()con debounce y emisiónAuthenticating → Authenticated/SessionError. - Constructor simplificado y factory
BlocSession.fromRepository(...)para quick start.
- BD WebSocket (JSON-first)
- Nuevo
ServiceWsDbyGatewayWsDbImplcon multiplexing y reference counting; *FakeServiceWsDb* en memoria para pruebas. - BLoC
BlocWsDatabasecon ciclo de vida documentado y helpers (existsDoc,ensureDoc,mutateDoc,patchDoc).
- Nuevo
- Dominio / Utils
ModelAppVersioninmutable (UTC,metainmodificable,deepEqualsMap/deepHash).- Utilidades de igualdad/
hashprofundas para mapas y listas.
Ejemplos incluidos #
- Contacts CRUD (WebSocket DB):
bloc_ws_db_example.dart(form + visor de estado, colección en vivo). - Ledger 2024:
ledger_example.dart(torta y barras conCustomPainter, sin dependencias externas).
Documentación #
- Contratos ampliados y ejemplos para use cases de sesión,
GatewayAuth/RepositoryAuth,FacadeCrudDatabaseUsecases,BlocWsDatabaseyModelAppVersion. - Aclaraciones de ciclo de vida (
dispose, watches compartidos, “último evento gana”).
Pruebas #
- Suites completas para
GatewayAuthImpl,RepositoryAuthImpl,BlocSession(hooks ygetCurrentUser),GatewayWsDbImpl,FakeServiceWsDb,BlocWsDatabaseyModelAppVersion.
Migración rápida #
-
WS DB renombres
ServiceWsDatabase→ServiceWsDbFakeServiceWsDatabase→FakeServiceWsDbGatewayWsDatabaseImpl→GatewayWsDbImpl
-
Contrato JSON-first
- Si usabas
ServiceWsDatabase<T>, mueve el mapeo de tipos al Repository/Gateway y trabaja conMap<String, dynamic>.
- Si usabas
-
BlocSession
- Reemplaza constructores antiguos por el simplificado o
BlocSession.fromRepository. - Si utilizas
authStateChanges, consumeEither<ErrorItem, Map<String, dynamic>?>.
- Reemplaza constructores antiguos por el simplificado o
-
Hooks de sesión
- Usa
addFunctionToProcessTValueOnStream(key, fn, executeNow)para efectos en segundo plano sin suscribirte alStream.
- Usa
Notas: Cambios no rompientes salvo renombres de WS DB y ajustes de constructor/streams en sesión. Los ejemplos sirven como guía de integración inmediata.
1.30.5 - 2025-10-13 #
Added #
- Session –
BlocSession.getCurrentUser()- Método público para consultar el usuario actual desde el repositorio.
- Emite
Authenticating→Authenticated(éxito) oSessionError(falla). - Debounce interno para evitar llamadas redundantes ante interacciones rápidas de UI.
- Lanza
StateErrorsi se invoca trasdispose().
- Example – WebSocket DB (Contacts CRUD)
bloc_ws_db_example.dart: demo completa de CRUD + realtime conBlocWsDatabase<ContactModel>yContactsCollectionBloc.- Muestra
WsDbState, transition log y lista en vivo. - Arquitectura ilustrada:
FakeServiceWsDb→GatewayWsDbImpl→RepositoryWsDatabaseImpl→FacadeWsDatabaseUsecases→BlocWsDatabase.
Changed #
- Use Cases (Session):
GetCurrentUserUsecaseahora invoca correctamenterepository.getCurrentUser()sin parámetros.
Docs #
- Session Usecases: DartDoc ampliado con contratos, parámetros, valores de retorno y ejemplos
para:
GetCurrentUserUsecase,LogInSilentlyUsecase,LogInUserAndPasswordUsecase,LoginWithGoogleUsecase,LogOutUsecase,RecoverPasswordUsecase,RefreshSessionUsecase,SignInUserAndPasswordUsecase,WatchAuthStateChangesUsecase, y el agregadorSessionUsecases.
- CRUD Facade: documentación extendida de
FacadeCrudDatabaseUsecases(visión general, ejemplo integral, clarificación de constructores y distinción entre use cases individuales y métodos de conveniencia).
Tests #
- BlocSession:
bloc_session_get_current_user_test.dart- Cubre éxito/falla, lógica de debounce y comportamiento post-
dispose().
- Cubre éxito/falla, lógica de debounce y comportamiento post-
Notas: Cambios no rompientes. Asegúrate de no invocar
getCurrentUser()después dedispose()y considera el debounce al escribir pruebas o automatizaciones de UI.
1.30.4 - 2025-10-12 #
Added #
- DB (JSON-first):
ServiceWsDb— servicio abstracto estilo WebSocket/NoSQL que opera * exclusivamente* conMap<String, dynamic>:- Operaciones:
save,read,delete,documentStream,collectionStream.
- Operaciones:
- DB Fake:
FakeServiceWsDb— implementación en memoria para pruebas/desarrollo:- Latencia configurable, simulación de errores, deep copy, de-dupe por contenido y hooks para inspección interna.
- Gateway WS:
GatewayWsDbImpl— capa multiplexada sobreServiceWsDb:- Multiplexing: comparte una sola suscripción por
docId. - Reference counting:
watch/detachWatchyreleaseDocpara lifecycle eficiente;disposepara teardown global. - Error mapping: todo a
Either<ErrorItem, …>víaErrorMapper. - Configuración:
idKeypersonalizado,readAfterWrite,treatEmptyAsMissing.
- Multiplexing: comparte una sola suscripción por
- Mapper de errores:
WsDbErrorMiniMapperpara mapearArgumentError/StateErrora JSON de error estructurado. - Example:
bloc_ws_db_example.dart— demo completa CRUD + realtime de Contactos:- UI de dos paneles (formulario + visor de estado).
BlocWsDatabase<ContactModel>(documento) yContactsCollectionBloc(colección).- Muestra
WsDbState, ledger de transiciones y lista en vivo. - Flujo recomendado:
FakeServiceWsDb→GatewayWsDbImpl→RepositoryWsDatabaseImpl→FacadeWsDatabaseUsecases→BlocWsDatabase.
Changed #
- Estandarización de nombres (WS DB):
ServiceWsDatabase→ServiceWsDbFakeServiceWsDatabase→FakeServiceWsDbGatewayWsDatabaseImpl→GatewayWsDbImpl
Deprecated #
ServiceWsDatabase<T>: marcado como@Deprecateden favor del enfoque JSON-first; el type mapping queda en Repository/Gateway.
Docs #
bloc_ws_database.dart:- Aclara que publica un único stream de
WsDbState(el último evento gana cuando hay múltipleswatchactivos). - Documenta
dispose: best-effort para desprender watches y no dispone stacks compartidos. - Mejora la descripción de ciclo de vida de watch (
startWatch,stopWatch,stopAllWatches).
- Aclara que publica un único stream de
Tests #
- FakeServiceWsDb: suite integral (operaciones básicas, configuración, manejo de errores).
- GatewayWsDbImpl: lectura, escritura, borrado y watch; mapeo de errores y lifecycle por referencias.
- BlocWsDatabase:
bloc_ws_database_ext_test.dart- Estado ante
read/write/delete(doc,loading,error). startWatch/stopWatch/stopAllWatches, facade detachment y coordinación dewatchUntil.- Lifecycle:
disposecancela suscripciones sin disponer repos compartidos. - Helpers:
existsDoc,ensureDoc,mutateDoc,patchDoc.
- Estado ante
Migration notes #
- Renombres: actualiza imports y tipos a
ServiceWsDb,FakeServiceWsDb,GatewayWsDbImpl. - Deprecación: si usabas
ServiceWsDatabase<T>, migra al contrato JSON-first (Map<String, dynamic>); mueve el mapeo de tipos a Repository/Gateway. - Comportamiento de
treatEmptyAsMissing: si tu servicio devuelve{}para not found, habilita esta opción en el Gateway para recibir unLeft(ErrorItem)consistente. - Multiplexing: si tenías watch duplicados por
docId, ahora se comparte la suscripción; considera llamardetachWatch/releaseDocal desmontar widgets para liberar referencias.
Notas: No hay cambios incompatibles fuera de los renombres y la deprecación indicada. El ejemplo de Contactos sirve como guía de integración sin dependencias externas.
1.30.3 - 2025-10-12 #
Added #
-
Domain –
ModelAppVersion: modelo inmutable para versionamiento de apps.- Campos:
id,appName,version,buildNumber,platform,channel,minSupportedVersion,forceUpdate,artifactUrl,changelogUrl,commitSha,buildAt. fromJson/toJsonpara (de)serialización robusta.
- Campos:
-
Utils – Deep compare & hashing:
Utils.deepEqualsDynamicpara comparar recursivamente valores dinámicos (listas/mapas anidados).Utils.deepEqualsMappara comparar mapas con llavesString.Utils.deepHashpara hash profundo (orden-independiente en mapas, orden-sensible en listas).
Changed #
- ModelAppVersion (refactor):
- Inmutabilidad reforzada:
buildAtse almacena siempre en UTC;metaqueda envuelto enMap.unmodifiabletanto en el constructor como encopyWith. - Igualdad y hashing:
operator==usaUtils.deepEqualsMapparameta;hashCodeusaUtils.deepHashgarantizando consistencia con la igualdad por contenido. - JSON:
fromJsonnormaliza llaves demetay endurece el parsing;toJsonserializabuildAtcomo UTC.
- Inmutabilidad reforzada:
Docs #
- ModelAppVersion: DartDoc detallada de contratos y comportamiento de JSON (UTC,
metainmodificable). - Utils: documentación y ejemplos de uso para
deepEqualsDynamic,deepEqualsMapydeepHash.
Tests #
- model_app_version_test.dart:
- Garantías de inmutabilidad (UTC,
metainmodificable). - Igualdad profunda y consistencia
hashCode. - Cobertura de
copyWith. - Round-trip JSON con mapas dinámicos y variaciones de zona horaria.
- Garantías de inmutabilidad (UTC,
1.30.2 - 2025-10-12 #
Added #
- Session – Side-effect hooks en
BlocSession:addFunctionToProcessTValueOnStream(key, callback, [executeNow=false]): registra un callback que se dispara en cada emisión deSessionState, con opción de ejecución inmediata usando el estado actual.deleteFunctionToProcessTValueOnStream(key): elimina el callback registrado por su clave.containsFunctionToProcessValueOnStream(key): verifica si existe un callback para la clave dada.
Tests #
- bloc_session_hooks_test.dart: cobertura completa para registro, ejecución inmediata,
eliminación, reemplazo y comportamiento de ciclo de vida (limpieza en
dispose()).
Notes #
- Cambios no rompientes. Las APIs de hooks exponen de forma segura la funcionalidad subyacente
de
BlocGeneralsin modificar el flujo de sesión existente.
1.30.1 - 2025-09-24 #
Changed #
- Session:
BlocSessionahora extiendeBlocModulepara unificar el ciclo de vida con el resto de BLoCs del paquete.
Added #
- Session: identificador estático
BlocSession.namepara trazabilidad y registros.
Fixed #
- Lifecycle: se sobrescribe
dispose()enBlocSessionpara alinearlo con el contrato deBlocModule, garantizando liberación consistente de recursos.
Notes #
- No hay cambios en la API pública de métodos de
BlocSession. - Si tu código dependía del tipo base anterior en anotaciones genéricas o type checks, ajusta
las restricciones para aceptar
BlocModule.
1.30.0 - 2025-09-24 #
Added #
- Ledger – Datos y demo visual:
defaultLedgerModel(dataset liviano 2024: ingresos/egresos por categoría).ledger_example.dart: página Flutter que renderiza pie y barras anuales por categoría/mes usandoCustomPainter(sin dependencias externas).
- Session – API de arranque rápido:
BlocSession.fromRepository(RepositoryAuth repo): factory recomendado que cablea automáticamente los use cases necesarios.
- Session – Calidad de vida:
SessionError.error: alias demessagepara acceso conveniente.
- Auth – Pruebas Gateway/Repo:
- Suite completa para
GatewayAuthImpl:- Stubs
_StubServiceSessiony fakeErrorMapper. - Cobertura de rutas felices (
Right), errores de payload (Left) y excepciones de servicio. - Verificación del stream
authStateChanges(Rightcon usuario/null,Leften error).
- Stubs
- Suite completa para
RepositoryAuthImpl:- Stubs
_StubGateway,_FakeErrorMapper. - Cobertura de happy paths, errores del gateway, excepciones y stream
authStateChanges. - Se expone
ackToVoid(antes_ackToVoid) para mejorar testabilidad.
- Stubs
- Suite completa para
Changed #
- Auth – Contratos y documentación (revisión de flujo):
GatewayAuthdocumentado como frontera segura de dominio para operaciones de autenticación:- Contratos de comportamiento, manejo de errores e I/O (solo primitivos/JSON).
- DartDoc por método con precondiciones y
Eitheresperado, más ejemplo mínimo con fake.
GatewayAuthImplalinea documentación: mapeo de errores y lógica del stream.authStateChangesahora documentado/emiteEither<ErrorItem, Map<String, dynamic>?>.
- Session – Constructor simplificado:
BlocSessionelimina el parámetro explícitoWatchAuthStateChangesUsecase; ahora se obtiene vía la fachadaSessionUsecases. Menos parámetros, inicialización y pruebas más claras.
Fixed #
- Session: corrección del deep copy en session refresh y en el current user, evitando compartir referencias internas de manera no intencional.
Docs #
- RepositoryAuth / RepositoryAuthImpl:
- DartDoc ampliado: contratos de comportamiento, políticas de manejo de errores y semántica de métodos; ejemplo mínimo de uso.
- GatewayAuth / GatewayAuthImpl:
- DartDoc exhaustivo alineado con los nuevos contratos, detalle de mapeo de errores y manejo de streams.
Tests #
- GatewayAuthImpl / RepositoryAuthImpl: mayor cobertura de ramas y edge cases (bloques
try-catch, acknowledgement). - BlocSession:
bloc_session_from_repository_test.dart:- Transiciones de estado vía stream del repositorio (
boot). - Flujos de autenticación (
logIn,logOut). - Políticas post-dispose (
returnLastSnapshot,returnSessionError).
- Transiciones de estado vía stream del repositorio (
Migration notes #
BlocSession(posible cambio rompiente):- Si usabas el constructor con
WatchAuthStateChangesUsecasecomo parámetro, migra a:- Constructor simplificado (sin ese parámetro), o
BlocSession.fromRepository(repo)como opción recomendada.
- Si usabas el constructor con
- Streams de auth:
- Asegura que tu capa superior consuma
Either<ErrorItem, Map<String, dynamic>?>enauthStateChanges.
- Asegura que tu capa superior consuma
- Ejemplos:
- Consulta
bloc_session_example.dartyledger_example.dartpara patrones de integración de UI sin dependencias externas.
- Consulta
Notas: El objetivo de esta versión es consolidar el auth flow con contratos claros, mejorar la testabilidad y ofrecer ejemplos prácticos de ledger y sesión listos para copiar en proyectos reales.
1.29.0 - 2025-09-24 #
Added #
- Graph models (2D):
ModelGraph,ModelPointyModelGraphAxisSpecpara representar datos tabulares o de series temporales. - ModelGraph – helpers y demos:
defaultModelGraph()con 3 puntos por defecto y rangos de ejes automáticos.demoPizzaPrices2024Graph()(precios mensuales de pizza en COP para 2024).- Constantes:
defaultModelPoint,defaultModelPoints,defaultXAxisSpec,defaultYAxisSpec.
- Example app:
graph_example.dart(PizzaPricesApp) con:BlocGeneral<ModelGraph>, gráfico de línea y tabla de precios.- Inyección periódica de datos simulados cada 5 s.
- Render propio sin dependencias vía
_SimpleLineChartPainter. - Componentes
_Header,_GraphCard,_TableCard.
- Utils:
Utils.listEquals(comparación superficial sensible al orden).Utils.listHash(hash sensible al orden).
Changed #
- JSON/robustez:
ModelGraph.fromJson: parseo laxo de títulos (convierte dinámicos aString, vacíos →'').ModelPoint.fromJson: maneja vectores nulos/no-map sin lanzar (devuelve vector inválido controlado).
- Inmutabilidad:
ModelGraph.pointsahora es inmodificable tras construcción y encopyWith.
- Nombres y organización (consistencia):
- Renombrados:
GraphAxisSpec→ModelGraphAxisSpec. - Renombrados:
GraphAxisSpecEnum→ModelGraphAxisSpecEnum. - Reubicados enums:
ModelGraphAxisSpecEnumenmodel_graph.dart;ModelPointEnumenmodel_point.dart.
- Renombrados:
- Cálculo numérico:
ModelVector.equalsApproxusa tolerancia combinada absoluta/relativa con ULP slack para comparaciones de punto flotante más estables.
Docs #
- DartDoc ampliado y aclarado para:
ModelGraph,ModelPoint,ModelGraphAxisSpec: construcción, contratos, manejo de JSON y ejemplos de uso.- Utilidades JSON (
mapFromDynamic,listFromDynamic,convertJsonToList,getJsonEncode) con ejemplos.
Tests #
- ModelGraph:
- Parseo laxo de
fromJson, inmutabilidad depoints, igualdad por valor (==,hashCode),copyWithinmutable,fromTable(rango de ejes y mapeo X), round-trip JSON (incluye títulosnull/vacíos).
- Parseo laxo de
- ModelGraphAxisSpec (antes
GraphAxisSpec):- Des/serialización JSON (válidos y con ruido),
copyWith, igualdad yhashCode, comportamiento con rangos min/max invertidos (sin validación automática).
- Des/serialización JSON (válidos y con ruido),
- ModelPoint:
- Round-trip JSON, igualdad y
copyWith; robustez ante vectores nulos/no-map.
- Round-trip JSON, igualdad y
- Utils:
- Cobertura para
listEqualsylistHash.
- Cobertura para
Notas: No hay cambios en APIs existentes.
1.28.0 - 2025-09-24 #
Added #
- FinancialMovementModel – Tests: casos para normalización de montos, round-trip JSON y
diferencias por
mathPrecision. - Utils.listFromDynamic – Tests: validación con entradas mixtas (ruido, llaves extra,
null) y verificación de compatibilidad conLedgerModel.fromJson. - LedgerModel – Tests: cobertura para JSON en formas válidas variadas, inmutabilidad, balance entero/decimal, igualdad/hash y sensibilidad al orden.
Changed #
- FinancialMovementModel:
- Política de no-negativos:
fromDecimal,fromJsonycopyWithnormalizan montos conabs(). El signo no codifica ingreso/egreso (lo definecategory). mathPrecision: ahora se lee/escribe en JSON y forma parte de==/hashCode.fromJson: usacontainsKeypara distinguir entre valor provisto ydefaultMathPrecision.
- Política de no-negativos:
- LedgerModel (inmutabilidad):
fromJsonycopyWithenvuelven listas conList.unmodifiable.- Se documenta que el ctor principal espera listas ya inmutables.
- Igualdad/orden (
LedgerModel): se mantiene igualdad profunda sensible al orden yhashCodeconsistente con ese contrato.
Fixed #
- LedgerModel: corrección crítica en
_listHashpara usare.hashCode(eliminadoe?.hashCode) evitando discrepancias de hash.
Docs #
- FinancialMovementModel: contrato aclarado (entero escalado, uso recomendado de
fromDecimal, límites de precisión) y ejemplo mínimo. - LedgerModel: contrato de inmutabilidad, ejemplo mínimo y nota sobre costo de
toString().
Notas:
- El modelo financiero ahora siempre almacena montos no negativos; si tu lógica dependía del signo para distinguir ingreso/egreso, usa el campo
category.- Al incorporarse
mathPrecisiona==/hashCode, comparaciones y sets/maps podrían cambiar si mezclas precisiones distintas para el mismo valor numérico.
1.27.0 - 2025-09-13 #
Added #
- BlocOnboarding:
AutoAdvancePolicypara controlar con mayor granularidad cuándo el flujo avanza automáticamente al siguiente paso.
Changed #
-
BlocOnboarding – Navegación y contratos:
back()evita el auto-avance incluso si el paso defineautoAdvanceAfter, mejorando la previsibilidad de la UX; se ejecuta elonEnterdel paso previo.- Se refinó el contrato de
onEnter: no debe lanzar; devolverLeft(ErrorItem)para permanecer en el paso; debe ser rápido (el trabajo pesado va a use cases);nullimplica éxito inmediato. autoAdvanceAftersolo aplica tras unonEnterexitoso.
-
ErrorItem:
- Serialización/deserialización más robusta: niveles desconocidos hacen fallback a
ErrorLevelEnum.systemInfo. copyWith(meta:)retorna un mapa inmodificable para prevenir mutaciones accidentales.
- Serialización/deserialización más robusta: niveles desconocidos hacen fallback a
Docs #
- DartDoc ampliado para
OnboardingStep,OnEnterResult,ErrorItem,ErrorLevelEnumyErrorItemEnum, incluyendo ejemplos de uso y pautas de UI.
Tests #
- Onboarding: suite completa que cubre configuración/arranque (pasos vacíos/no vacíos),
onEnter(éxito,Left(ErrorItem), excepción),retryOnEnter,clearError,next/backcon cancelación de temporizadores,currentStepen múltiples estados, guardas de race conditions vía epoch, y preservación de errores en estados terminales (skip,complete). - Theme/Repository: casos adicionales para robustez del gateway y verificación de normalización HEX en JSON (sin cambios de API).
- ErrorItem: round-trip JSON, fallback de niveles desconocidos, e inmutabilidad de
metaencopyWith.
Notas: No hay cambios incompatibles.
- Si tus pruebas asumían auto-avance al usar
back(), actualízalas al nuevo comportamiento.- Si tu código modificaba el mapa devuelto por
copyWith(meta: ...), clónalo antes de mutarlo.
1.26.2 - 2025-09-13 #
Added #
- BlocOnboarding: se introduce
AutoAdvancePolicypara controlar con mayor granularidad cuándo el flujo avanza automáticamente al siguiente paso.
Changed #
- ErrorItem:
- Serialización/deserialización más robusta: niveles de error desconocidos ahora hacen fallback
a
ErrorLevelEnum.systemInfo. copyWith(meta:)devuelve un mapa inmodificable para evitar mutaciones accidentales.
- Serialización/deserialización más robusta: niveles de error desconocidos ahora hacen fallback
a
Docs #
- DartDoc ampliado para
ErrorItem,ErrorLevelEnumyErrorItemEnum, con ejemplos de uso y pautas para UI.
Tests #
- Cobertura añadida para:
- Fallback de niveles desconocidos en
errorLevel. - Round-trip JSON de
ErrorItem. - Inmutabilidad de
metaencopyWith. - Casos básicos de
AutoAdvancePolicyenBlocOnboarding.
- Fallback de niveles desconocidos en
Notas: No hay cambios incompatibles. Si tu código mutaba el mapa retornado por
copyWith(meta: ...), clónalo explícitamente antes de modificarlo.AutoAdvancePolicymantiene el comportamiento por defecto previo salvo que definas una política específica.
1.26.1 - 2025-09-13 #
Added #
- BlocOnboarding – Tests completos:
- Configuración y arranque (pasos vacíos / no vacíos).
- Comportamiento de
onEnter: éxito, error (Left(ErrorItem)) y excepciones. retryOnEnteryclearError.- Navegación
nextybackcon cancelación de temporizadores y transiciones de estado. - Verificación de
currentStepen múltiples estados. - Guardas contra race conditions mediante el mecanismo de epoch.
- Estados terminales (
skip,complete) preservando errores. - Efectos de
dispose()sobre temporizadores.
Changed #
- BlocOnboarding – Navegación hacia atrás:
back()ahora evita el auto-avance incluso si el paso tieneautoAdvanceAfter, ofreciendo una UX más predecible.- Se mantiene la ejecución de
onEnterdel paso previo.
- OnboardingStep – Contratos y documentación:
onEnterno debe lanzar; devolverLeft(ErrorItem)para permanecer en el paso.- Debe ser rápido; trabajo pesado va a use cases.
nullimplica éxito inmediato.autoAdvanceAftersolo aplica tras unonEnterexitoso.- Se refinó la documentación de
title,description,autoAdvanceAfter,onEntery del typedefOnEnterResult.
Tests #
- Onboarding: suite ampliada (ver “Added”).
- Theme: cobertura extendida y robustez del gateway (sin cambios de API).
Docs #
- Ejemplo adicional que cubre distintas configuraciones de
OnboardingStepy resultados deonEnter. - Aclaraciones de contrato en DartDoc para
OnboardingStepyOnEnterResult.
Notas: No hay cambios incompatibles. El cambio en
back()mejora la previsibilidad del flujo; si tus pruebas asumían auto-avance al retroceder, actualízalas para reflejar el nuevo comportamiento.
1.26.0 - 2025-09-07 #
Added #
- Pruebas robustas para
Utils
Cobertura extendida engetDoubleygetIntegerFromDynamic:- Manejo de nulos,
NaN, infinitos y valores no numéricos. - Parsing de números en notación científica (
3e2,-3e-2, etc.). - Soporte para formatos internacionales (coma o punto como separador decimal, moneda, separadores de miles).
- Garantía de fallback seguro (
0para enteros,NaNodefaultValuepara dobles). - Se incluyen los cambios tipo fix detallados en el changelog desde la version 1.25.0.
- Manejo de nulos,
1.25.3 - 2025-09-07 #
Added #
ModelVector.fromXY(int x, int y)factory constructor for convenient creation from integer coordinates.- Integer-oriented getters
xandy(using.round(), policy: .5 away from zero). keyproperty providing a canonical"x,y"representation for map/set usage.copyWithInts({int? x, int? y})method to create safe copies overriding integer axes.
Docs #
- Extended DartDoc with examples for new methods and clarified rounding policy.
- Documented reversibility limitations when the original
dx/dyare non-integers.
Tests #
- Added unit tests to validate:
- Rounding policy for positive/negative decimals.
- Stability of
keyand reversibility viafromXY. copyWithIntsbehavior with partial overrides.- Factory
fromXYproducing expected doubles.
1.25.2 - 2025-09-07 #
Added #
- Nueva GitHub Action ligera para validar commits antes de merge:
- Verificación de que todos los commits estén firmados y verificados.
- Ejecución de
flutter analyzepara asegurar el cumplimiento de linters. - Validación de
dart formaten modo estricto. - Bloqueo de
dependency_overridesenpubspec.yaml.
Changed #
- Ajustes en reglas de protección de ramas:
developymasterahora requieren commits firmados, revisiones por PR y checks de estado obligatorios (incluyendo CodeQL).- Publicación automática a pub.dev únicamente desde
mastertras un merge exitoso.
Security #
- Integración con CodeQL en ramas
developymasterpara análisis de calidad y seguridad. - Configuración de bot con firmas SSH para asegurar que los commits generados por automatizaciones tengan estado Verified.
1.25.1 - 2025-09-07 #
Added #
-
Documentación exhaustiva de estados de sesión
SessionState,Unauthenticated,Authenticating,Authenticated,Refreshing,SessionErrorahora tienen DartDoc claro sobre propósito, transiciones y expectativas de UI.
-
Getter
stateenBlocSession- Exposición fiel del último
SessionStatepublicado (útil para UI que necesita distinguirAuthenticating,RefreshingoSessionError).
- Exposición fiel del último
-
Páginas demo ampliadas en el example
SessionDemoPage(flujo completo de sesión conEither).WsDatabaseUserDemoPage(CRUD + watch en tiempo real con motor de cambios).ConnectivityDemoPage(flujo puro de conectividad conEither).BlocLoadingDemoPage(acción única con anti-flicker y cola FIFO).BlocResponsiveDemoPage(grid responsivo, simulación de tamaño, métricas).BlocOnboardingDemoPage(pasos cononEnterque retornaEither, auto-avance y manejo de errores).
Changed #
-
BlocSession.stateOrDefault- Mantiene retrocompatibilidad simplificando a binario “autenticado / no autenticado”.
- Si el estado es
Authenticated, devuelve la misma instancia (sin reasignar). - Para cualquier otro estado, devuelve
const Unauthenticated().
-
Getters validados
stream,sessionStream,state,stateOrDefault,currentUser,isAuthenticatedverifican ciclo de vida.- Tras
dispose(), el acceso lanzaStateErrorcon mensaje claro (contrato más seguro).
-
Alias canónico
streames el alias recomendado;sessionStreamse mantiene para compatibilidad.
Fixed #
-
refreshSession()en fallo- Si el repo retorna
Left, el BLoC pasa aSessionErrory no permanece enRefreshing.
- Si el repo retorna
-
Idempotencia de
boot()- Múltiples llamadas re-adjuntan la suscripción sin pérdidas de eventos.
-
cancelAuthSubscription()- Al cancelar manualmente, el stream deja de reflejar cambios hasta volver a llamar a
boot()(documentado y cubierto en tests).
- Al cancelar manualmente, el stream deja de reflejar cambios hasta volver a llamar a
Tests #
-
Suite de dispose y getters
- Acceso a getters tras
dispose()→StateErroresperado. stream/sessionStreamno emiten trasdispose().stateOrDefaultes un snapshot y no provoca emisiones.
- Acceso a getters tras
-
Cobertura de secuencias clave
refreshSession()conLeft→SessionError.boot()idempotente ycancelAuthSubscription()en medio de sesión.- Debouncer en
logIn()(múltiples llamadas rápidas → 1 hit a repo).
Migration notes #
-
Acceso tras
dispose()- Evita leer
bloc.state,bloc.currentUser,bloc.isAuthenticatedobloc.streamdespués de disponer. - Si existe código heredado que pudiera acceder tras
dispose(), rodéalo conmounted(en UI) o reordena el ciclo de vida. - Opción de compatibilidad temporal:
SessionState safeState(BlocSession b) { try { return b.state; } catch (_) { return const Unauthenticated(); } }
- Evita leer
-
Snapshots
- Para lógicas binarias, usa
stateOrDefault. - Para lógicas de progreso/errores, usa
state.
- Para lógicas binarias, usa
Dev notes #
-
Si necesitas soportar versiones de Flutter sin
Color.withValues, cambia a:void main(){ color.withOpacity(0.75); // en lugar de withValues(alpha: 0.75) }
— Fin de 1.25.1 —
1.25.0 - 2025-08-17 #
Fixed #
BlocLoading: evitaStateErroral invocarhide()trasdispose()y corrige emisiones duplicadas en operaciones rápidas encadenadas.BlocResponsive: corrige la clasificación inicial deScreenSizeen el primer frame y en cambios de tamaño (web/desktop), garantizando una emisión consistente.BlocOnboarding: maneja correctamente listas vacías de pasos ([]) y asegura queonCompletese dispare una sola vez. Cierre seguro de streams endispose().- Demos: rutas e imports ajustados para compilar en
stablesin advertencias; correcciones menores de tipografía y estilos.
Changed #
- Mejora no funcional del rendimiento en
BlocLoadingal consolidar colas internas para mostrar/ocultar estados de carga (sin cambios de API). - Ajustes menores a los breakpoints documentados de
BlocResponsivepara reflejar con mayor claridad los límites recomendados (sin cambios de API).
Docs #
- DartDoc en inglés para
BlocLoading,BlocResponsiveyBlocOnboarding, incluyendo ejemplos de uso en Markdown y descripción de parámetros/enums. - Comentarios explicativos añadidos en cada demo page para guiar la implementación paso a paso.
- Sección breve en el README principal enlazando a las demos y a la guía de adopción rápida de cada BLoC.
Tests #
- Grupos de pruebas con
flutter_testpor BLoC; casos agregados para:- Inicialización y
dispose(). - Cambios de tamaño en
BlocResponsive. - Flujos felices y escenarios borde en
BlocOnboarding. - Condiciones de carrera en
BlocLoading.
- Inicialización y
CI #
- Endurecimiento de validaciones de PR (análisis, formato y cobertura) y verificación de actualización del
CHANGELOG.md. - Mantención: workflows revisados para compatibilidad con
stableactual.
Notas: No hay cambios incompatibles. No se requiere migración.
1.24.2 - 2025-08-17 #
Added #
- Actualización menor en
BlocLoadingpara soportar FiFo en la cola de tareas. - Se agrega demo para
BlocLoadingenbloc_loading_demo_page.dart. - Se agrega
BlocOnboardingpara gestionar estados de onboarding en aplicaciones. - Se agrega
BlocResponsivepara manejar estados de UI responsiva en aplicaciones con diferentes resoluciones y pantallas.
1.24.1 - 2025-08-17 #
Fixed #
- Corrección de advertencias menores en la implementación de conectividad y manejo de streams.
- Ajustes en la documentación de los nuevos módulos y ejemplos agregados.
- Mejoras menores en la robustez de los tests unitarios para los servicios de conectividad y WebSocket.
- Actualización de dependencias para mantener la compatibilidad con las últimas versiones de Flutter y Dart.
1.24.0 - 2025-08-15 #
✅ Added
- Stack WS Database (end-to-end)
GatewayWsDatabaseImpl(ref-count pordocId, multiplexing conBlocGeneral,detachWatch/releaseDoc/dispose).RepositoryWsDatabaseImpl<T extends Model>(mapeofromJson/toJson, opcional serialización dewrite/deletepordocId).- Usecases CRUD & WS:
databases_crud_usecases.dartfacade_crud_database.dartfacade_ws_database_usecases.dart
- Estado y config:
ws_db_state.dart(estado inmutableWsDbState<T>)ws_db_config.dart(valores por defecto / helpers)
- BLoC:
bloc_ws_database.dart(orquestación thin; sin streams ad-hoc; mira/actualizaWsDbState)
- Infra fake para desarrollo/pruebas
fake_service_ws_database.dartcondocumentStream/collectionStream, lectura/escritura y borrado por colección+id.ws_database_user_demo_page.dart(example) con ticker opcional que incrementajwt.countRefen vivo.home_page.dart(example) como entrada de demo.
- Utilidades transversales
Unit(tipo “valor nulo” seguro paraEithery comandos sin payload).PerKeyFifoExecutor<K>(ejecutor FIFO por clave para serializar tareas pordocId).
- Tests
bloc_ws_database_test.dartgateway_ws_database_impl.test.dartrepository_ws_database_impl.test.dartfake_service_ws_database.test.dartper_key_fifo_executor_test.dartunit_test.dartfake_db_repo.dart(mocks & fakes auxiliares)
🔄 Changed
- Contratos de gateway/repositorio document-centricos y transport-agnostic:
GatewayWsDatabase: énfasis en watch por documento con canal compartido y manejo explícito de ciclo de vida (detachWatch/releaseDoc).RepositoryWsDatabase<T>: agrega helpers de ciclo de vida y opción de serializar escrituras pordocId.
- Mapeo de errores unificado mediante
DefaultErrorMapperen todas las capas.
🩹 Fixed
- Posibles leaks de suscripción cuando varios watchers observaban el mismo
docId: ahora se hace ref-count y se libera la suscripción real al llegar a cero referencias.
🧭 Migration notes
- Si usas
watch(docId), después de cancelar tuStreamSubscriptionllama siempre adetachWatch(docId)para liberar el canal subyacente. - Para comandos sin retorno, retorna
Right(unit)en lugar devoid. - Para evitar carreras al escribir/borrar la misma entidad, usa el
RepositoryWsDatabaseImplconserializeWrites: trueo el utilitarioPerKeyFifoExecutor.
📚 Docs
- README actualizado con:
- “Cómo integrar BlocWsDatabase (con FakeServiceWsDatabase)”
- Snippets dedicados de
UnityPerKeyFifoExecutor(casos de uso comunes).
1.23.1 - 2025-08-11 #
Fixed #
- Correcciones menores y ajustes en la implementación de
GatewayAuthyRepositoryAuthpara mejorar la compatibilidad y robustez. - Documentación actualizada y ampliada en los nuevos archivos y clases agregadas.
- Se resolvieron advertencias y errores menores detectados en pruebas unitarias y análisis estático.
1.23.0 - 2025-08-11 #
Actualización cambios de master
1.22.0 - 2025-08-10 #
- Agregamos la clase BlocResponsive, BlocOnboarding y BlocLoading para mejorar la gestión de estados en aplicaciones con diferentes resoluciones y pantallas.
1.21.2 - 2025-07-22 #
- Corregido error de formateo en changelog al agregar la versión
1.21.1(error de formato en el encabezado de la versión).
1.21.1 - 2025-07-22 #
- Revisados y resueltos los
TODOpendientes en el código. - Sincronizada la rama
developconmaster. - Corregido el error de análisis estático (“Angle brackets will be interpreted as HTML”) en el comentario de
fake_service_preferences.dart(ajuste de espacios enMap<String, dynamic>).
1.21.0 - 2025-07-09 #
- Se crea la clase
FakeServiceHttppara simular el comportamiento de un servicio HTTP en pruebas unitarias. - Se actualiza el readme para incluir ejemplos de uso de las clases
FakeServiceHttp,FakeServiceSesion,FakeServiceWsDatabase,FakeServiceGeolocation,FakeServiceGyroscope,FakeServiceNotifications,FakeServiceConnectivityyFakeServicePreferences.
1.20.2 - 2025-07-08 #
- Se crea la clase
FakeServiceSesionpara simular el comportamiento de un servicio de sesión en pruebas unitarias. - Se crea la clase
FakeServiceWsDatabasepara simular el comportamiento de un servicio de base de datos WebSocket en pruebas unitarias. - Se crea la clase
FakeServiceGeolocationpara simular el comportamiento de un servicio de geolocalización en pruebas unitarias. - Se crea la clase
FakeServiceGyroscopepara simular el comportamiento de un servicio de giroscopio en pruebas unitarias. - Se crea la clase
FakeServiceNotificationspara simular el comportamiento de un servicio de notificaciones en pruebas unitarias. - Se crea la clase
FakeServiceConnectivitypara simular el comportamiento de un servicio de conectividad en pruebas unitarias. - Se crea la clase
FakeServicePreferencespara simular el comportamiento de un servicio de preferencias en pruebas unitarias.
1.20.1 - 2025-07-07 #
Fixed #
- Se documenta y agrega el archivo
README_STRUCTURE.mdcon la guía recomendada de estructura de carpetas y arquitectura para proyectos basados enjocaagura_domain.
1.20.0 - 2025-07-06 #
Changed #
- Documentación ampliada y mejorada para las clases
BlocGeneralyBlocModule, incluyendo ejemplos de uso detallados en DartDoc y explicaciones sobre la gestión de listeners y el ciclo de vida de los BLoC.
1.19.0 - 2025-05-25 #
Added #
- Nueva clase
LedgerModelque representa un libro contable con ingresos y egresos separados, y permite el cálculo de saldo total y decimal. - Enum
LedgerEnumpara mantener uniformidad en las claves JSON utilizadas porLedgerModel. - Funcionalidades en
MoneyUtilspara:totalAmount,totalDecimalAmountaverage,filterByCategorytotalPerCategory,totalDecimalPerCategory
- Métodos adicionales útiles como:
getLatestMovement,containsMovementsortByDate,filterByDateRangetotalByMonth,totalDecimalByMonth
Added (Tests) #
- Pruebas unitarias para
LedgerModel: serialización, igualdad, cálculo de saldos ycopyWith. - Pruebas unitarias para
MoneyUtils: validaciones de agregación, filtros y agrupaciones por categoría y mes.
Changed #
- Documentación enriquecida con ejemplos de uso en DartDoc para
MoneyUtils.
1.18.1 - 2025-05-18 #
chore(github): reestructura develop desde master y actualiza workflows
1.18.0 - 2025-05-18 #
Added #
- Nueva estructura estándar de errores:
HttpErrorItems: Manejo de errores HTTP comunes como 404, 401, 500, con niveles de severidad (danger,severe,warning,systemInfo).WebSocketErrorItems: Representación de errores típicos de WebSocket como fallos de conexión, cierre inesperado o mensajes malformados.NetworkErrorItems: Para errores como sin conexión, timeout o servidor inaccesible.
- Inclusión de métodos estáticos
fromCode()yfromStatusCode()en las clases anteriores. - Clave estandarizada
meta['source']y validadores parameta['httpCode']y similares.
Updated #
ErrorItemahora soporta un campoerrorLevelde tipoErrorLevelEnum.- El valor por defecto es
ErrorLevelEnum.systemInfopara obligar a definirlo explícitamente. - Se agregó
toString()actualizado para incluir elerrorLevel.
- El valor por defecto es
- Documentación de cada clase de error fue ampliada con enlaces a los estándares utilizados (MDN, Flutter API).
Tests #
- Se agregaron pruebas unitarias para
HttpErrorItems,WebSocketErrorItems, yNetworkErrorItemsincluyendo validación deerrorLevel,fromCode()y fallbackunknown(). - Se probaron los casos límite y el mapeo correcto desde códigos conocidos.
Docs #
- Actualizado el
README.mdpara reflejar las nuevas capacidades de los modelos de error y sus usos sugeridos.
1.17.1 - 2025-05-18 #
1.17.0 - 2025-03-25 #
Added #
- Implemented the financial movement model to manage financial transactions.
1.16.0 - 2025-01-25 #
Added #
- Configured GitHub Actions secrets to securely store sensitive data required for workflows.
- Validated and updated the GitHub maintainers group to ensure proper repository access and management.
Updated #
- Enhanced the
READMEfile with updated repository details and instructions for contributors.
1.15.2 - 2024-12-29 #
Fixed #
- Translation of the changelog to English.
- Completion and translation of inline documentation to English.
- Extended unit tests.
- Updated linter package.
1.15.1 - 2024-08-25 #
Fixed #
- Minor changes in DartDoc formatting without affecting the code or its functionality.
1.15.0 - 2024-08-25 #
Added #
MedicalRecordModel: Added model, tests, and DartDoc documentation for the patient's state in the dentist app.
1.14.0 - 2024-08-25 #
Added #
MedicationModel: Added model, tests, and DartDoc documentation for the appointment model.
1.13.0 - 2024-08-25 #
Added #
AppointmentModel: Added model, tests, and DartDoc documentation for the appointment model.ContactModel: Added model, tests, and DartDoc documentation for the contact model.
1.9.0 - 2024-07-28 #
1.8.0 - 2024-07-24 #
Added #
DentalConditionModel: Added model and documentation for the dental condition.
1.7.1 - 2024-07-22 #
Changed #
MedicalDiagnosisModel: Added documentation for developers in the file.
1.6.0 - 2024-07-21 #
1.5.0 - 2024-07-07 #
1.4.2 - 2024-06-30 #
Added #
Colors: Added a color map to the UML diagram with an explanation in the README to improve visualization of the implementation state of models.
Fixed #
UML Diagram: Updated to reflect the implementation state of models:Either,Left,Right: Confirmed.Model,UserModel,AttributeModel<T>: Confirmed.Bloc,BlocModule,BlocGeneral<T>,BlocCore: Confirmed.UI:ModelMainMenuModelconfirmed.Connectivity:ConnectionTypeEnum,ConnectivityModelconfirmed.Citizen:PersonModelunder review,LegalIdModelconfirmed.Obituary:ObituaryModel,DeathRecordModelconfirmed.Shops:StoreModelconfirmed.Geolocation:AddressModelconfirmed.
1.2.1 #
- Added
Debouncerclass. - Added documentation in the README file.
1.0.0 #
- Added
Eitherclass. - Approved for production.
0.3.2 #
- Added
DeathRecordModelintoObituaryModel.
0.3.1 #
- Fixed
fromJsonfactory constructor inLegalIdModel.
0.3.0 #
- Added
LegalIdModel.
0.2.0 #
- Added
DeathRecordModel.
0.1.2 #
- Minor fix to
ObituaryModelto includevigilDateandburialDatein parameters. - Increased unit test coverage.
0.1.01 #
- Changed officially to beta.
- Minor fix to
ObituaryModelto includemessagein parameters.
0.0.9 #
- Added
ObituaryModel. - Minor fix to
PersonModelto cover variable names properly. - Increased
PersonModelandDateUtilstest coverage.
0.0.8 #
- Added DateTime-to-String utility.
0.0.71 #
- Changed attributes in Models to
Map<String, AttributeModel<dynamic>>.
0.0.7 #
- Completed
PersonModelwith subModelClass (AttributeModel) for information.
0.0.6 #
- Completed
StoreModelwith formatted options.
0.0.5 #
- Added
StoreModel.
0.0.4 #
- Added
AddressModel.
0.0.3 #
- Added
Utilsclass for JSON conversion management. - Improved unit test coverage.
0.0.2 #
- Added
UserModeland established some immutable conditions.
0.0.1 #
- Added initial abstract class
Model.