fastapi-startkit 0.13.7__tar.gz → 0.14.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/PKG-INFO +1 -1
  2. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/pyproject.toml +12 -1
  3. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/.DS_Store +0 -0
  4. fastapi_startkit-0.14.0/src/fastapi_startkit/__init__.py +4 -0
  5. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/application.py +51 -17
  6. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/collection/collection.py +4 -13
  7. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/commands/publish_command.py +11 -3
  8. fastapi_startkit-0.14.0/src/fastapi_startkit/config/app.py +13 -0
  9. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/configuration/Configuration.py +7 -6
  10. fastapi_startkit-0.14.0/src/fastapi_startkit/configuration/config.py +25 -0
  11. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/console.py +1 -0
  12. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/container/container.py +8 -4
  13. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/environment/environment.py +38 -33
  14. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/exceptions/handler.py +12 -4
  15. fastapi_startkit-0.14.0/src/fastapi_startkit/facades/Config.py +3 -0
  16. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Config.pyi +0 -1
  17. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Facade.py +1 -0
  18. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Vite.py +1 -1
  19. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Vite.pyi +1 -2
  20. fastapi_startkit-0.14.0/src/fastapi_startkit/fastapi/__init__.py +4 -0
  21. fastapi_startkit-0.14.0/src/fastapi_startkit/fastapi/commands/serve_command.py +98 -0
  22. fastapi_startkit-0.14.0/src/fastapi_startkit/fastapi/exceptions.py +28 -0
  23. fastapi_startkit-0.14.0/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +30 -0
  24. fastapi_startkit-0.14.0/src/fastapi_startkit/fastapi/routers/router.py +193 -0
  25. fastapi_startkit-0.14.0/src/fastapi_startkit/fastapi/testing/__init__.py +5 -0
  26. fastapi_startkit-0.14.0/src/fastapi_startkit/fastapi/testing/test_case.py +31 -0
  27. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/helpers/dataclass.py +4 -1
  28. fastapi_startkit-0.14.0/src/fastapi_startkit/helpers/string.py +51 -0
  29. fastapi_startkit-0.14.0/src/fastapi_startkit/inertia/constant.py +7 -0
  30. fastapi_startkit-0.14.0/src/fastapi_startkit/inertia/context.py +10 -0
  31. fastapi_startkit-0.14.0/src/fastapi_startkit/inertia/inertia.py +193 -0
  32. fastapi_startkit-0.14.0/src/fastapi_startkit/inertia/middleware.py +106 -0
  33. fastapi_startkit-0.14.0/src/fastapi_startkit/inertia/props/props.py +6 -0
  34. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/inertia/provider.py +4 -1
  35. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/loader/Loader.py +2 -5
  36. fastapi_startkit-0.14.0/src/fastapi_startkit/logging/ChannelFactory.py +27 -0
  37. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/__init__.py +1 -4
  38. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +11 -9
  39. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +7 -4
  40. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +10 -11
  41. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +5 -5
  42. fastapi_startkit-0.14.0/src/fastapi_startkit/logging/channels/SlackChannel.py +20 -0
  43. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/channels/StackChannel.py +6 -4
  44. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +6 -6
  45. fastapi_startkit-0.14.0/src/fastapi_startkit/logging/channels/TerminalChannel.py +13 -0
  46. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/channels/__init__.py +1 -1
  47. fastapi_startkit-0.14.0/src/fastapi_startkit/logging/config/__init__.py +9 -0
  48. fastapi_startkit-0.14.0/src/fastapi_startkit/logging/config/channels.py +45 -0
  49. fastapi_startkit-0.14.0/src/fastapi_startkit/logging/config/logging.py +24 -0
  50. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +10 -10
  51. fastapi_startkit-0.14.0/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +100 -0
  52. fastapi_startkit-0.14.0/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +77 -0
  53. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +11 -7
  54. fastapi_startkit-0.14.0/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +39 -0
  55. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/drivers/__init__.py +1 -1
  56. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/factory.py +7 -6
  57. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/handler.py +1 -0
  58. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/listeners.py +5 -7
  59. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/logger.py +3 -2
  60. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +1 -0
  61. fastapi_startkit-0.14.0/src/fastapi_startkit/logging/managers/__init__.py +1 -0
  62. fastapi_startkit-0.14.0/src/fastapi_startkit/logging/providers/log_provider.py +37 -0
  63. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/__init__.py +1 -0
  64. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +7 -1
  65. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +11 -2
  66. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +13 -8
  67. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +24 -16
  68. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py +11 -2
  69. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +8 -4
  70. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +3 -9
  71. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +9 -2
  72. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +7 -1
  73. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +7 -1
  74. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +8 -4
  75. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +6 -1
  76. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +5 -13
  77. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +5 -5
  78. fastapi_startkit-0.14.0/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +19 -0
  79. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/config/config.py +2 -1
  80. fastapi_startkit-0.14.0/src/fastapi_startkit/masoniteorm/config/database.py +24 -0
  81. fastapi_startkit-0.14.0/src/fastapi_startkit/masoniteorm/connections/connection.py +140 -0
  82. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/connections/factory.py +24 -13
  83. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +12 -2
  84. fastapi_startkit-0.14.0/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +20 -0
  85. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +4 -3
  86. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +1 -0
  87. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +2 -6
  88. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +3 -2
  89. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +3 -2
  90. fastapi_startkit-0.14.0/src/fastapi_startkit/masoniteorm/factory/__init__.py +1 -0
  91. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +3 -4
  92. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +1 -3
  93. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/migrations/Migration.py +20 -34
  94. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +1 -0
  95. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +6 -5
  96. fastapi_startkit-0.14.0/src/fastapi_startkit/masoniteorm/models/builder.py +388 -0
  97. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/models/caster.py +25 -12
  98. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/models/fields.py +8 -2
  99. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/models/model.py +33 -9
  100. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/models/registry.py +3 -1
  101. fastapi_startkit-0.14.0/src/fastapi_startkit/masoniteorm/models/relationship.py +23 -0
  102. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +1 -3
  103. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +7 -6
  104. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +27 -20
  105. fastapi_startkit-0.14.0/src/fastapi_startkit/masoniteorm/providers/__init__.py +1 -0
  106. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +3 -1
  107. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +1 -3
  108. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +16 -49
  109. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +3 -1
  110. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +3 -1
  111. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +1 -3
  112. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +1 -3
  113. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +1 -3
  114. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +7 -3
  115. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -1
  116. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +23 -27
  117. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +27 -1
  118. fastapi_startkit-0.14.0/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +213 -0
  119. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +3 -2
  120. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +78 -102
  121. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +6 -21
  122. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +17 -45
  123. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +1 -1
  124. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +21 -63
  125. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +1 -3
  126. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +1 -3
  127. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +8 -17
  128. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +15 -33
  129. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +2 -7
  130. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +16 -29
  131. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +17 -38
  132. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +31 -3
  133. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/seeds/Seeder.py +4 -4
  134. fastapi_startkit-0.14.0/src/fastapi_startkit/masoniteorm/testing/__init__.py +6 -0
  135. fastapi_startkit-0.14.0/src/fastapi_startkit/masoniteorm/testing/transaction.py +25 -0
  136. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/config/database.py +5 -5
  137. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/config.py +2 -7
  138. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/schema/Schema.py +13 -25
  139. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeleteScope.py +3 -9
  140. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/testing/BaseTestCaseSelectGrammar.py +20 -68
  141. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/testing/Database.py +5 -7
  142. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/testing/TestCase.py +1 -0
  143. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/User.py +1 -1
  144. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/eagers/test_eager.py +3 -9
  145. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/factories/test_factories.py +1 -3
  146. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/integrations/databases/migrations/2026_01_01_000000_create_users_table.py +1 -0
  147. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/integrations/model.py +6 -4
  148. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/integrations/test_model.py +16 -4
  149. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/models/test_models.py +3 -9
  150. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder.py +4 -12
  151. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder_relationships.py +1 -3
  152. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder.py +7 -13
  153. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder_scopes.py +1 -3
  154. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_select_grammar.py +11 -17
  155. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_accessors_and_mutators.py +1 -3
  156. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_model.py +2 -5
  157. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_belongs_to_many.py +2 -6
  158. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_relationships.py +2 -6
  159. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder.py +4 -4
  160. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder_alter.py +7 -15
  161. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_scopes.py +1 -3
  162. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_query_builder.py +3 -9
  163. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_select_grammar.py +14 -18
  164. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder.py +2 -1
  165. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder_alter.py +1 -1
  166. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/providers/Provider.py +6 -7
  167. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/providers/app_provider.py +1 -3
  168. fastapi_startkit-0.14.0/src/fastapi_startkit/testing/__init__.py +5 -0
  169. fastapi_startkit-0.14.0/src/fastapi_startkit/testing/test_case.py +33 -0
  170. fastapi_startkit-0.14.0/src/fastapi_startkit/utils/__init__.py +0 -0
  171. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/utils/http.py +0 -1
  172. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/utils/location.py +1 -0
  173. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/utils/structures.py +6 -6
  174. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/utils/time.py +1 -0
  175. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/vite/config/vite.py +0 -4
  176. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/vite/exceptions.py +1 -1
  177. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/vite/providers/provider.py +21 -7
  178. fastapi_startkit-0.14.0/src/fastapi_startkit/vite/stubs/package.json +16 -0
  179. fastapi_startkit-0.14.0/src/fastapi_startkit/vite/stubs/resources/css/app.css +1 -0
  180. fastapi_startkit-0.14.0/src/fastapi_startkit/vite/stubs/resources/js/app.ts +23 -0
  181. fastapi_startkit-0.14.0/src/fastapi_startkit/vite/stubs/templates/index.html +59 -0
  182. fastapi_startkit-0.14.0/src/fastapi_startkit/vite/stubs/tsconfig.json +115 -0
  183. fastapi_startkit-0.14.0/src/fastapi_startkit/vite/stubs/vite.config.ts +13 -0
  184. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/vite/vite.py +60 -49
  185. fastapi_startkit-0.13.7/src/fastapi_startkit/__init__.py +0 -3
  186. fastapi_startkit-0.13.7/src/fastapi_startkit/config/app.py +0 -10
  187. fastapi_startkit-0.13.7/src/fastapi_startkit/config/facades/__init__.py +0 -1
  188. fastapi_startkit-0.13.7/src/fastapi_startkit/config/facades/config.py +0 -11
  189. fastapi_startkit-0.13.7/src/fastapi_startkit/facades/Config.py +0 -5
  190. fastapi_startkit-0.13.7/src/fastapi_startkit/fastapi/__init__.py +0 -5
  191. fastapi_startkit-0.13.7/src/fastapi_startkit/fastapi/commands/serve_command.py +0 -71
  192. fastapi_startkit-0.13.7/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -38
  193. fastapi_startkit-0.13.7/src/fastapi_startkit/helpers/string.py +0 -31
  194. fastapi_startkit-0.13.7/src/fastapi_startkit/inertia/inertia.py +0 -74
  195. fastapi_startkit-0.13.7/src/fastapi_startkit/inertia/middleware.py +0 -45
  196. fastapi_startkit-0.13.7/src/fastapi_startkit/logging/ChannelFactory.py +0 -20
  197. fastapi_startkit-0.13.7/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -19
  198. fastapi_startkit-0.13.7/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -14
  199. fastapi_startkit-0.13.7/src/fastapi_startkit/logging/config/__init__.py +0 -2
  200. fastapi_startkit-0.13.7/src/fastapi_startkit/logging/config/channels.py +0 -43
  201. fastapi_startkit-0.13.7/src/fastapi_startkit/logging/config/logging.py +0 -23
  202. fastapi_startkit-0.13.7/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -84
  203. fastapi_startkit-0.13.7/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -94
  204. fastapi_startkit-0.13.7/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +0 -60
  205. fastapi_startkit-0.13.7/src/fastapi_startkit/logging/managers/__init__.py +0 -1
  206. fastapi_startkit-0.13.7/src/fastapi_startkit/logging/providers/log_provider.py +0 -34
  207. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -19
  208. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/config/database.py +0 -24
  209. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/connections/connection.py +0 -103
  210. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/models/builder.py +0 -210
  211. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -11
  212. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/providers/__init__.py +0 -1
  213. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -260
  214. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/tests/fixtures/db.py +0 -13
  215. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/tests/fixtures/factory.py +0 -13
  216. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/tests/fixtures/migration.py +0 -61
  217. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/tests/fixtures/model.py +0 -47
  218. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/tests/fixtures/seeder.py +0 -8
  219. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/tests/models/test_model.py +0 -157
  220. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/tests/models/test_model_attributes.py +0 -186
  221. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/tests/sqlite/models/test_sqlite_model.py +0 -110
  222. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/tests/sqlite/relationships/test_sqlite_relationships.py +0 -51
  223. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/tests/sqlite/test_case.py +0 -20
  224. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/collection/test_collection.py +0 -741
  225. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/commands/test_shell.py +0 -89
  226. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/config/test_db_url.py +0 -128
  227. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/builder/test_sqlite_builder_insert.py +0 -39
  228. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/builder/test_sqlite_builder_pagination.py +0 -63
  229. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/builder/test_sqlite_query_builder.py +0 -1065
  230. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/builder/test_sqlite_query_builder_eager_loading.py +0 -97
  231. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/builder/test_sqlite_query_builder_relationships.py +0 -134
  232. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/builder/test_sqlite_transaction.py +0 -49
  233. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_delete_grammar.py +0 -75
  234. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_insert_grammar.py +0 -103
  235. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_select_grammar.py +0 -482
  236. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/grammar/test_sqlite_update_grammar.py +0 -113
  237. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/models/test_attach_detach.py +0 -131
  238. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/models/test_observers.py +0 -115
  239. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_has_many_through_relationship.py +0 -166
  240. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_has_one_through_relationship.py +0 -150
  241. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/relationships/test_sqlite_polymorphic.py +0 -99
  242. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_sqlite_schema_builder.py +0 -370
  243. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_sqlite_schema_builder_alter.py +0 -244
  244. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_table.py +0 -109
  245. fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm.backup/tests/sqlite/schema/test_table_diff.py +0 -166
  246. fastapi_startkit-0.13.7/src/fastapi_startkit/tests/configurations/test_config_merge.py +0 -54
  247. fastapi_startkit-0.13.7/src/fastapi_startkit/tests/test_case.py +0 -15
  248. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/carbon/__init__.py +0 -0
  249. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
  250. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/collection/__init__.py +0 -0
  251. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/commands/__init__.py +0 -0
  252. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/config/__init__.py +0 -0
  253. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/configuration/__init__.py +0 -0
  254. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
  255. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
  256. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/configuration/providers/__init__.py +0 -0
  257. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/container/__init__.py +0 -0
  258. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/environment/__init__.py +0 -0
  259. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/exceptions/__init__.py +0 -0
  260. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
  261. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/exceptions.backup/DD.py +0 -0
  262. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/exceptions.backup/ExceptionHandler.py +0 -0
  263. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/exceptions.backup/__init__.py +0 -0
  264. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/exceptions.backup/exceptionite/__init__.py +0 -0
  265. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/exceptions.backup/exceptionite/blocks.py +0 -0
  266. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/exceptions.backup/exceptionite/controllers.py +0 -0
  267. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/exceptions.backup/exceptionite/solutions.py +0 -0
  268. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/exceptions.backup/exceptionite/tabs.py +0 -0
  269. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/exceptions.backup/handlers/DumpExceptionHandler.py +0 -0
  270. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/exceptions.backup/handlers/HttpExceptionHandler.py +0 -0
  271. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/exceptions.backup/handlers/ModelNotFoundHandler.py +0 -0
  272. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Auth.py +0 -0
  273. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Auth.pyi +0 -0
  274. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Broadcast.py +0 -0
  275. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Cache.py +0 -0
  276. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Dump.py +0 -0
  277. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
  278. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Gate.py +0 -0
  279. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
  280. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Hash.py +0 -0
  281. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
  282. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Inertia.py +0 -0
  283. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Loader.py +0 -0
  284. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
  285. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Mail.py +0 -0
  286. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
  287. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Notification.py +0 -0
  288. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
  289. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Queue.py +0 -0
  290. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
  291. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
  292. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
  293. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Request.py +0 -0
  294. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
  295. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Response.py +0 -0
  296. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
  297. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Session.py +0 -0
  298. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
  299. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Storage.py +0 -0
  300. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Storage.pyi +0 -0
  301. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Url.py +0 -0
  302. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
  303. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/View.py +0 -0
  304. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/View.pyi +0 -0
  305. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/facades/__init__.py +0 -0
  306. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/fastapi/commands/__init__.py +0 -0
  307. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/inertia/__init__.py +0 -0
  308. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/loader/__init__.py +0 -0
  309. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/logging/providers/__init__.py +0 -0
  310. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +0 -0
  311. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +0 -0
  312. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/CanOverrideConfig.py +0 -0
  313. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/CanOverrideOptionsDefault.py +0 -0
  314. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/Command.py +0 -0
  315. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/Entry.py +0 -0
  316. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +0 -0
  317. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
  318. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
  319. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
  320. {fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/helpers → fastapi_startkit-0.14.0/src/fastapi_startkit/masoniteorm/config}/__init__.py +0 -0
  321. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +0 -0
  322. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +0 -0
  323. {fastapi_startkit-0.13.7/src/fastapi_startkit/masoniteorm/query → fastapi_startkit-0.14.0/src/fastapi_startkit/masoniteorm/helpers}/__init__.py +0 -0
  324. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
  325. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
  326. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
  327. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
  328. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
  329. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +0 -0
  330. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
  331. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +0 -0
  332. {fastapi_startkit-0.13.7/src/fastapi_startkit/utils → fastapi_startkit-0.14.0/src/fastapi_startkit/masoniteorm/query}/__init__.py +0 -0
  333. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
  334. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
  335. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +0 -0
  336. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
  337. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +0 -0
  338. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
  339. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
  340. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +0 -0
  341. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +0 -0
  342. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
  343. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
  344. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
  345. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
  346. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +0 -0
  347. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +0 -0
  348. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/seeds/__init__.py +0 -0
  349. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
  350. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
  351. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/.gitignore +0 -0
  352. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/CACHEDIR.TAG +0 -0
  353. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/README.md +0 -0
  354. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/lastfailed +0 -0
  355. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/nodeids +0 -0
  356. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/__init__.py +0 -0
  357. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/exceptions.py +0 -0
  358. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/factories/Factory.py +0 -0
  359. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/factories/__init__.py +0 -0
  360. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/scopes/BaseScope.py +0 -0
  361. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeletesMixin.py +0 -0
  362. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyMixin.py +0 -0
  363. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyScope.py +0 -0
  364. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/scopes/__init__.py +0 -0
  365. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/scopes/scope.py +0 -0
  366. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/testing/__init__.py +0 -0
  367. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/connections/test_base_connections.py +0 -0
  368. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/integrations/config/__init__.py +0 -0
  369. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/integrations/config/database.py +0 -0
  370. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_delete_grammar.py +0 -0
  371. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_insert_grammar.py +0 -0
  372. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_qmark.py +0 -0
  373. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_select_grammar.py +0 -0
  374. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_update_grammar.py +0 -0
  375. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder.py +0 -0
  376. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder_alter.py +0 -0
  377. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_mysql_builder_transaction.py +0 -0
  378. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_transactions.py +0 -0
  379. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/connections/test_mysql_connection_selects.py +0 -0
  380. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_delete_grammar.py +0 -0
  381. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_insert_grammar.py +0 -0
  382. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_qmark.py +0 -0
  383. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_update_grammar.py +0 -0
  384. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_many_through.py +0 -0
  385. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_one_through.py +0 -0
  386. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_global_scopes.py +0 -0
  387. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_soft_delete.py +0 -0
  388. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_transaction.py +0 -0
  389. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_delete_grammar.py +0 -0
  390. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_insert_grammar.py +0 -0
  391. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_update_grammar.py +0 -0
  392. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/relationships/test_postgres_relationships.py +0 -0
  393. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/scopes/test_default_global_scopes.py +0 -0
  394. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/seeds/test_seeds.py +0 -0
  395. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/masoniteorm.backup/tests/utils.py +0 -0
  396. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/providers/__init__.py +0 -0
  397. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/utils/collections.py +0 -0
  398. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/utils/console.py +0 -0
  399. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/utils/data/mime.types +0 -0
  400. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/utils/filesystem.py +0 -0
  401. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/utils/str.py +0 -0
  402. {fastapi_startkit-0.13.7 → fastapi_startkit-0.14.0}/src/fastapi_startkit/vite/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fastapi-startkit
3
- Version: 0.13.7
3
+ Version: 0.14.0
4
4
  Summary: Fastapi Starter kit components
5
5
  Author: Bedram Tamang
6
6
  Author-email: Bedram Tamang <tmgbedu@gmail.com>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fastapi-startkit"
3
- version = "0.13.7"
3
+ version = "0.14.0"
4
4
  description = "Fastapi Starter kit components"
5
5
  authors = [
6
6
  {name = "Bedram Tamang", email = "tmgbedu@gmail.com"}
@@ -46,10 +46,21 @@ dev = [
46
46
  "dumpdie>=1.5.0",
47
47
  "pytest>=9.0.3",
48
48
  "pytest-asyncio>=1.3.0",
49
+ "ruff>=0.9.0",
49
50
  "twine>=6.2.0",
50
51
  ]
51
52
 
52
53
 
54
+ [tool.ruff]
55
+ line-length = 120
56
+
57
+ [tool.ruff.lint]
58
+ select = ["F401"]
59
+ fixable = ["F401"]
60
+
61
+ [tool.ruff.lint.per-file-ignores]
62
+ "__init__.py" = ["F401"]
63
+
53
64
  [tool.pytest.ini_options]
54
65
  asyncio_mode = "auto"
55
66
 
@@ -0,0 +1,4 @@
1
+ from .application import Application
2
+ from .configuration.config import Config
3
+
4
+ __all__ = ["Application", "Config"]
@@ -1,13 +1,13 @@
1
1
  import os
2
+ from fastapi_startkit.providers.app_provider import AppProvider
2
3
  from pathlib import Path
3
4
  from typing import TYPE_CHECKING, Optional
4
5
  from typing import Type, Callable, Any, List, TypeVar, Generic
5
6
 
6
- from fastapi_startkit.providers.app_provider import AppProvider
7
7
  from .config import AppConfig
8
8
  from .configuration.providers import ConfigurationProvider
9
9
  from .container import Container
10
- from .environment.environment import LoadEnvironment
10
+ from .environment.environment import Environment
11
11
 
12
12
  if TYPE_CHECKING:
13
13
  from fastapi import FastAPI, APIRouter
@@ -16,11 +16,12 @@ if TYPE_CHECKING:
16
16
  from fastapi_startkit.exceptions import ExceptionHandler
17
17
 
18
18
 
19
- def app() -> 'Container':
19
+ def app() -> "Container":
20
20
  return Container.instance()
21
21
 
22
22
 
23
- TConfig = TypeVar('TConfig', bound=AppConfig)
23
+ TConfig = TypeVar("TConfig", bound=AppConfig)
24
+
24
25
 
25
26
  class Application(Container, Generic[TConfig]):
26
27
  DEFAULT_PROVIDERS = [
@@ -28,10 +29,17 @@ class Application(Container, Generic[TConfig]):
28
29
  AppProvider,
29
30
  ]
30
31
 
31
- def __init__(self, base_path: str = None, env=None, providers=None, config: Type[TConfig] | None = None, exception_handler: Type[ExceptionHandler] | None = None):
32
+ def __init__(
33
+ self,
34
+ base_path: str | Path = None,
35
+ env=None,
36
+ providers=None,
37
+ config: Type[TConfig] | None = None,
38
+ exception_handler: Type[ExceptionHandler] | None = None,
39
+ ):
32
40
  super().__init__()
33
41
 
34
- self.base_path: str = base_path or os.getcwd()
42
+ self.base_path: Path = Path(base_path) if base_path else Path(os.getcwd())
35
43
  self.env = env
36
44
  self.providers = self.DEFAULT_PROVIDERS + (providers or [])
37
45
  self.published_resources = {}
@@ -47,7 +55,7 @@ class Application(Container, Generic[TConfig]):
47
55
  self.configure_exception_handler()
48
56
 
49
57
  # Boot application
50
- self.load_environment()
58
+ self.resolve_environment()
51
59
  self.configure_config()
52
60
  self.configure_paths()
53
61
  self.register_providers()
@@ -55,8 +63,20 @@ class Application(Container, Generic[TConfig]):
55
63
  self._fastapi: Optional["FastAPI"] = None
56
64
  self.load_providers()
57
65
 
66
+ def set_environment(self, env: str):
67
+ self.env = env
68
+ return self
69
+
70
+ def load_environment(self):
71
+ """Reload environment variables for the current self.env."""
72
+ Environment.load_base(base_path=self.base_path)
73
+ Environment.load(self.env, base_path=self.base_path)
74
+ return self
75
+
58
76
  def configure_exception_handler(self):
59
- self.exception_manager: ExceptionHandler = self._exception_handler_class(application=self)
77
+ self.exception_manager: ExceptionHandler = self._exception_handler_class(
78
+ application=self
79
+ )
60
80
  self.exception_manager.register()
61
81
  self.exception_manager.install()
62
82
  self.bind("exception_manager", self.exception_manager)
@@ -67,6 +87,9 @@ class Application(Container, Generic[TConfig]):
67
87
  config = {}
68
88
  if isinstance(provider_data, tuple):
69
89
  provider_class, config = provider_data
90
+
91
+ if callable(config):
92
+ config = config()
70
93
  else:
71
94
  provider_class = provider_data
72
95
 
@@ -87,7 +110,7 @@ class Application(Container, Generic[TConfig]):
87
110
  return self
88
111
 
89
112
  def use_base_path(self, path: str):
90
- return str(Path(self.base_path) / path)
113
+ return self.base_path / path
91
114
 
92
115
  def get(self, path: str, **kwargs) -> Callable:
93
116
  return self.fastapi.get(path, **kwargs)
@@ -119,7 +142,7 @@ class Application(Container, Generic[TConfig]):
119
142
  return self
120
143
 
121
144
  # Add middleware
122
- def add_middleware(self, middleware_class: Type['BaseHTTPMiddleware'], **options):
145
+ def add_middleware(self, middleware_class: Type["BaseHTTPMiddleware"], **options):
123
146
  self._fastapi.add_middleware(middleware_class, **options)
124
147
  return self
125
148
 
@@ -134,7 +157,9 @@ class Application(Container, Generic[TConfig]):
134
157
  return self
135
158
 
136
159
  # Add custom exception handlers
137
- def add_exception_handler(self, exc_class_or_status_code: Any, handler: Callable[..., Any]):
160
+ def add_exception_handler(
161
+ self, exc_class_or_status_code: Any, handler: Callable[..., Any]
162
+ ):
138
163
  self._fastapi.add_exception_handler(exc_class_or_status_code, handler)
139
164
  return self
140
165
 
@@ -155,11 +180,20 @@ class Application(Container, Generic[TConfig]):
155
180
  def __call__(self, *args, **kwargs):
156
181
  return self.fastapi
157
182
 
158
- def load_environment(self):
159
- LoadEnvironment(environment=self.env, base_path=self.base_path)
183
+ def resolve_environment(self):
184
+ self.env = Environment.resolve_environment(base_path=self.base_path, env=self.env)
185
+ Environment.load_base(base_path=self.base_path)
186
+ Environment.load(self.env, base_path=self.base_path)
160
187
 
161
188
  def is_debug(self) -> bool:
162
- return hasattr(self, '_config_instance') and self._config_instance is not None and getattr(self._config_instance, 'debug', False)
189
+ return (
190
+ hasattr(self, "_config_instance")
191
+ and self._config_instance is not None
192
+ and getattr(self._config_instance, "debug", False)
193
+ )
194
+
195
+ def is_testing(self) -> bool:
196
+ return self.env == "testing"
163
197
 
164
198
  def configure_config(self):
165
199
  if self._config is not None:
@@ -172,15 +206,15 @@ class Application(Container, Generic[TConfig]):
172
206
  return self._config_instance
173
207
 
174
208
  def configure_paths(self):
175
- self.bind('config.location', os.path.join(self.base_path, "config"))
209
+ self.bind("config.location", self.base_path / "config")
176
210
 
177
211
  def use_config_path(self, path: str = None):
178
- self.bind('config.location', path)
212
+ self.bind("config.location", path)
179
213
 
180
214
  return self
181
215
 
182
216
  def use_storage_path(self, path: str = None):
183
- self.bind('storage.location', path)
217
+ self.bind("storage.location", path)
184
218
 
185
219
  return self
186
220
 
@@ -310,9 +310,7 @@ class Collection:
310
310
  if collection_count == 0:
311
311
  return None
312
312
  elif count and count > collection_count:
313
- raise ValueError(
314
- "count argument must be inferior to collection length."
315
- )
313
+ raise ValueError("count argument must be inferior to collection length.")
316
314
  elif count:
317
315
  self._items = random.sample(self._items, k=count)
318
316
  return self
@@ -373,10 +371,7 @@ class Collection:
373
371
  return getattr(item, key, None)
374
372
 
375
373
  def sort(self, key=None, reverse=False):
376
- self._items.sort(
377
- key=lambda item: self.val(item, key),
378
- reverse=reverse
379
- )
374
+ self._items.sort(key=lambda item: self.val(item, key), reverse=reverse)
380
375
  return self
381
376
 
382
377
  def sum(self, key=None):
@@ -443,9 +438,7 @@ class Collection:
443
438
  if isinstance(item, dict):
444
439
  comparison = item.get(key)
445
440
  else:
446
- comparison = (
447
- getattr(item, key) if hasattr(item, key) else False
448
- )
441
+ comparison = getattr(item, key) if hasattr(item, key) else False
449
442
  if self._make_comparison(comparison, value, op):
450
443
  attributes.append(item)
451
444
  return self.__class__(attributes)
@@ -499,9 +492,7 @@ class Collection:
499
492
  def zip(self, items):
500
493
  items = self.__get_items(items)
501
494
  if not isinstance(items, list):
502
- raise ValueError(
503
- "The 'items' parameter must be a list or a Collection"
504
- )
495
+ raise ValueError("The 'items' parameter must be a list or a Collection")
505
496
 
506
497
  _items = []
507
498
  for x, y in zip(self, items):
@@ -15,13 +15,18 @@ class PublishCommand(Command):
15
15
  description = "Publish provider config files into the project."
16
16
 
17
17
  options = [
18
- option("provider", "p", description="Provider name to publish (e.g. LogProvider, log_provider).", flag=False),
18
+ option(
19
+ "provider",
20
+ "p",
21
+ description="Provider name to publish (e.g. LogProvider, log_provider).",
22
+ flag=False,
23
+ ),
19
24
  ]
20
25
 
21
26
  def handle(self):
22
27
  from fastapi_startkit.application import app
23
28
 
24
- application: 'Application' = app()
29
+ application: "Application" = app()
25
30
 
26
31
  if not application.published_resources:
27
32
  self.line("<comment>Nothing to publish.</comment>")
@@ -47,7 +52,10 @@ class PublishCommand(Command):
47
52
  dest_path = application.use_base_path(destination)
48
53
 
49
54
  if os.path.exists(dest_path):
50
- overwrite = self.confirm(f" <comment>{destination}</comment> already exists. Overwrite?", default=False)
55
+ overwrite = self.confirm(
56
+ f" <comment>{destination}</comment> already exists. Overwrite?",
57
+ default=False,
58
+ )
51
59
  if not overwrite:
52
60
  self.line(f" [{provider_key}] Skipped <comment>{destination}</comment>")
53
61
  continue
@@ -0,0 +1,13 @@
1
+ import os
2
+ from dataclasses import field, dataclass
3
+ from fastapi_startkit.environment.environment import env
4
+
5
+
6
+ @dataclass
7
+ class AppConfig:
8
+ name: str = field(
9
+ default_factory=lambda: os.getenv("APP_NAME", "FastAPI starter kit")
10
+ )
11
+ env: str = field(default_factory=lambda: os.getenv("APP_ENV", "development"))
12
+ debug: bool = field(default_factory=lambda: env("APP_DEBUG", "true"))
13
+ timezone: str = field(default_factory=lambda: os.getenv("APP_TIMEZONE", "UTC"))
@@ -1,6 +1,6 @@
1
1
  from fastapi_startkit.loader import Loader
2
2
  from ..utils.structures import data
3
- from ..exceptions import InvalidConfigurationLocation, InvalidConfigurationSetup
3
+ from ..exceptions import InvalidConfigurationSetup
4
4
 
5
5
 
6
6
  class Configuration:
@@ -26,14 +26,13 @@ class Configuration:
26
26
  def load(self):
27
27
  """At boot load configuration from all files and store them in here."""
28
28
  config_root = self.application.make("config.location")
29
- for module_name, module in Loader().get_modules(
30
- config_root, raise_exception=True
31
- ).items():
29
+ for module_name, module in (
30
+ Loader().get_modules(config_root, raise_exception=True).items()
31
+ ):
32
32
  params = Loader().get_parameters(module)
33
33
  for name, value in params.items():
34
34
  self._config[f"{module_name}.{name.lower()}"] = value
35
35
 
36
-
37
36
  def merge_with(self, path, external_config):
38
37
  """Merge external config at key with project config at same key. It's especially
39
38
  useful in Masonite packages in order to merge the configuration default package with
@@ -56,7 +55,9 @@ class Configuration:
56
55
  self.set(path, merged_config)
57
56
 
58
57
  def set(self, path, value):
59
- self._config[path] = value
58
+ from fastapi_startkit.helpers.dataclass import Dataclass
59
+
60
+ self._config[path] = Dataclass.to_dict(value)
60
61
 
61
62
  def has(self, path):
62
63
  return path in self._config
@@ -0,0 +1,25 @@
1
+ from typing import Any
2
+
3
+
4
+ class Config:
5
+ @staticmethod
6
+ def instance():
7
+ from fastapi_startkit.application import app
8
+
9
+ return app().make("config")
10
+
11
+ @staticmethod
12
+ def get(path: str, default: Any = None) -> Any:
13
+ return Config.instance().get(path, default)
14
+
15
+ @staticmethod
16
+ def set(path: str, value: Any) -> None:
17
+ Config.instance().set(path, value)
18
+
19
+ @staticmethod
20
+ def has(path: str) -> bool:
21
+ return Config.instance().has(path)
22
+
23
+ @staticmethod
24
+ def all() -> dict:
25
+ return Config.instance().all()
@@ -2,6 +2,7 @@ from cleo.application import Application as BaseApplication
2
2
  from cleo.io.io import IO
3
3
  from fastapi_startkit.application import Application
4
4
 
5
+
5
6
  class ConsoleApplication(BaseApplication):
6
7
  def __init__(self, app: Application):
7
8
  super().__init__()
@@ -27,9 +27,8 @@ class Container:
27
27
  raise RuntimeError("Container not initialized")
28
28
  return cls._instance
29
29
 
30
-
31
30
  def __init__(self):
32
- if not hasattr(self, 'objects'):
31
+ if not hasattr(self, "objects"):
33
32
  self.objects = {}
34
33
  self.strict = False
35
34
  self.override = True
@@ -216,7 +215,13 @@ class Container:
216
215
  raise ContainerError(str(e))
217
216
  else:
218
217
  for _, value in self.get_parameters(obj):
219
- if type(value.annotation) in (str, int, dict, list, tuple) or value.annotation in (str, int, dict, list, tuple):
218
+ if type(value.annotation) in (
219
+ str,
220
+ int,
221
+ dict,
222
+ list,
223
+ tuple,
224
+ ) or value.annotation in (str, int, dict, list, tuple):
220
225
  # Ignore any times a user is simply type hinting a parameter like (parameter:str or parameter:"str").
221
226
  # In this case we don't want to resolve anything but we do want
222
227
  # to insert any passing arguments we passed in
@@ -449,7 +454,6 @@ class Container:
449
454
  and obj in self._hooks[action]
450
455
  or obj.__class__ in self._hooks[action]
451
456
  ):
452
-
453
457
  for _, hook_list in self._hooks[action].items():
454
458
  for hook_obj in hook_list:
455
459
  hook_obj(obj, self)
@@ -3,30 +3,51 @@
3
3
  import os
4
4
  import sys
5
5
  from dotenv import load_dotenv
6
- from pathlib import Path
7
6
 
8
7
 
9
- class LoadEnvironment:
10
- def __init__(self, environment=None, override=True, only=None, base_path=None):
11
- self.base_path = Path(base_path) if base_path else Path(".")
12
- self._detect_env_from_argv()
8
+ class Environment:
9
+ @staticmethod
10
+ def resolve_environment(base_path=None, env: str | None = None):
11
+ Environment.resolve_environment_from_argument()
13
12
 
14
- if only:
15
- self._load(f".env.{only}", override=override)
16
- return
13
+ if "PYTEST_CURRENT_TEST" in os.environ:
14
+ return "testing"
15
+
16
+ # Explicit env parameter takes priority over os.environ APP_ENV
17
+ if env:
18
+ return env
19
+
20
+ if os.environ.get("APP_ENV"):
21
+ return os.environ["APP_ENV"]
22
+
23
+ path = base_path / ".env"
24
+ if not path.exists():
25
+ raise ValueError("Unable to determine environment.")
26
+
27
+ load_dotenv(path, override=True)
17
28
 
18
- resolved = self._resolve_environment(environment)
29
+ env = os.environ.get("APP_ENV")
30
+ if not env:
31
+ raise ValueError("APP_ENV not set after loading .env")
19
32
 
20
- # 2. Try .env.<resolved> first; fall back to .env when it doesn't exist.
21
- if resolved:
22
- specific = self.base_path / f".env.{resolved}"
23
- if specific.exists():
24
- load_dotenv(specific, override=override)
25
- return
33
+ return env
26
34
 
27
- load_dotenv(self.base_path / ".env", override=override)
35
+ @staticmethod
36
+ def load_base(base_path=None):
37
+ """Load the base .env file, resetting vars to their default values."""
38
+ path = base_path / ".env"
39
+ if path.exists():
40
+ load_dotenv(path, override=True)
41
+
42
+ @staticmethod
43
+ def load(env: str, override=True, only=None, base_path=None):
44
+ path = base_path / f".env.{env}"
45
+ if not path.exists():
46
+ return
47
+ load_dotenv(path, override=override)
28
48
 
29
- def _detect_env_from_argv(self):
49
+ @staticmethod
50
+ def resolve_environment_from_argument():
30
51
  """Parse --env=<value> or --env <value> from sys.argv, set APP_ENV,
31
52
  and remove the tokens so downstream CLI parsers (e.g. cleo) never see them."""
32
53
  args = sys.argv[1:]
@@ -41,22 +62,6 @@ class LoadEnvironment:
41
62
  sys.argv.pop(i + 1) # then the flag
42
63
  break
43
64
 
44
- def _resolve_environment(self, fallback):
45
- if "PYTEST_CURRENT_TEST" in os.environ:
46
- return "testing"
47
-
48
- if os.environ.get("APP_ENV"):
49
- return os.environ["APP_ENV"]
50
-
51
- if fallback:
52
- return fallback
53
-
54
- return None
55
-
56
- def _load(self, filename, override=False):
57
- path = self.base_path / filename
58
- load_dotenv(path, override=override)
59
-
60
65
 
61
66
  def env(value, default="", cast=True):
62
67
  """Helper to retrieve the value of an environment variable or returns
@@ -2,7 +2,6 @@ import sys
2
2
  import atexit
3
3
  from typing import Any, Callable, Dict, List, Optional, Type
4
4
 
5
- from dumpdie import dd
6
5
 
7
6
 
8
7
  class ExceptionHandler:
@@ -62,15 +61,24 @@ class ExceptionHandler:
62
61
  self.report_exception(exception)
63
62
 
64
63
  def report_exception(self, exception: Exception):
65
- if self.app and self.app.has('logger'):
64
+ context = self._build_context(exception)
65
+ if self.app and self.app.has("logger"):
66
66
  from fastapi_startkit.logging.logger import Logger
67
- Logger.error(self._build_context(exception))
67
+
68
+ Logger.error(context)
69
+ else:
70
+ print(context, file=sys.stderr)
68
71
 
69
72
  def _build_context(self, exception: Exception) -> str:
70
73
  import traceback
74
+
71
75
  context = f"{type(exception).__name__}: {exception}"
72
76
  if self.app and self.app.is_debug():
73
- context += "\n" + "".join(traceback.format_exception(type(exception), exception, exception.__traceback__))
77
+ context += "\n" + "".join(
78
+ traceback.format_exception(
79
+ type(exception), exception, exception.__traceback__
80
+ )
81
+ )
74
82
  return context
75
83
 
76
84
  async def handle(self, exception: Exception, context: Optional[Dict] = None) -> Any:
@@ -0,0 +1,3 @@
1
+ from fastapi_startkit.configuration.config import Config
2
+
3
+ __all__ = ["Config"]
@@ -1,6 +1,5 @@
1
1
  from typing import Any
2
2
 
3
-
4
3
  class Config:
5
4
  """Configuration facades to manage Masonite config files."""
6
5
  @staticmethod
@@ -1,4 +1,5 @@
1
1
  class Facade(type):
2
2
  def __getattr__(self, attribute, *args, **kwargs):
3
3
  from ..application import app
4
+
4
5
  return getattr(app().make(self.key), attribute)
@@ -2,4 +2,4 @@ from .Facade import Facade
2
2
 
3
3
 
4
4
  class Vite(metaclass=Facade):
5
- key = "vite"
5
+ key = "vite"
@@ -1,6 +1,5 @@
1
1
  from typing import Callable, Optional
2
2
 
3
-
4
3
  class Vite:
5
4
  """Facade for the Vite asset helper.
6
5
 
@@ -89,4 +88,4 @@ class Vite:
89
88
  @staticmethod
90
89
  def to_html() -> str:
91
90
  """Render pre-configured entry points as an HTML string."""
92
- ...
91
+ ...
@@ -0,0 +1,4 @@
1
+ from .providers.fastapi_provider import FastAPIProvider
2
+ from .routers.router import Router
3
+
4
+ __all__ = ["FastAPIProvider", "Router"]