@mytechtoday/augment-extensions 0.7.0 → 1.2.0
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.
- package/AGENTS.md +265 -232
- package/README.md +956 -771
- package/augment-extensions/coding-standards/bash/README.md +196 -196
- package/augment-extensions/coding-standards/bash/module.json +163 -163
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -336
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -289
- package/augment-extensions/coding-standards/css/README.md +40 -40
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -550
- package/augment-extensions/coding-standards/css/module.json +44 -44
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -448
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -492
- package/augment-extensions/coding-standards/html/README.md +40 -40
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -267
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -505
- package/augment-extensions/coding-standards/html/module.json +44 -44
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -349
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -194
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -487
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -550
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -667
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -267
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -612
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -505
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -48
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -515
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -448
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -492
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -439
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -349
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -486
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -463
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -543
- package/augment-extensions/coding-standards/js/README.md +46 -46
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -487
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -667
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -612
- package/augment-extensions/coding-standards/js/module.json +49 -49
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -515
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -439
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -486
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -463
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -543
- package/augment-extensions/coding-standards/php/README.md +248 -248
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -204
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -206
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -234
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -211
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -215
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -189
- package/augment-extensions/coding-standards/php/module.json +166 -166
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -480
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -332
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -472
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -561
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -402
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -425
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -627
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -336
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -677
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -279
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -392
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -186
- package/augment-extensions/coding-standards/php/rules/security.md +358 -358
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -403
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -331
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -426
- package/augment-extensions/coding-standards/powershell/README.md +154 -154
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -272
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -173
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -243
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -297
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -224
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -340
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -255
- package/augment-extensions/coding-standards/powershell/module.json +165 -165
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -439
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -240
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -384
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -383
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -482
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -296
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -314
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -466
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -244
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -266
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -209
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -314
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -268
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -197
- package/augment-extensions/coding-standards/python/README.md +48 -48
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -373
- package/augment-extensions/coding-standards/python/module.json +30 -30
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -884
- package/augment-extensions/coding-standards/python/rules/best-practices.md +232 -232
- package/augment-extensions/coding-standards/python/rules/code-organization.md +220 -220
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -831
- package/augment-extensions/coding-standards/python/rules/error-handling.md +1008 -1008
- package/augment-extensions/coding-standards/python/rules/naming-conventions.md +172 -172
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -409
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -446
- package/augment-extensions/coding-standards/python/rules/type-hints.md +253 -253
- package/augment-extensions/coding-standards/react/README.md +45 -45
- package/augment-extensions/coding-standards/react/module.json +27 -27
- package/augment-extensions/coding-standards/react/rules/component-patterns.md +214 -214
- package/augment-extensions/coding-standards/react/rules/hooks-best-practices.md +235 -235
- package/augment-extensions/coding-standards/react/rules/performance.md +300 -300
- package/augment-extensions/coding-standards/react/rules/state-management.md +265 -265
- package/augment-extensions/coding-standards/react/rules/typescript-react.md +271 -271
- package/augment-extensions/coding-standards/typescript/README.md +45 -45
- package/augment-extensions/coding-standards/typescript/module.json +27 -27
- package/augment-extensions/coding-standards/typescript/rules/naming-conventions.md +225 -225
- package/augment-extensions/collections/html-css-js/README.md +82 -82
- package/augment-extensions/collections/html-css-js/collection.json +41 -41
- package/augment-extensions/domain-rules/api-design/README.md +41 -41
- package/augment-extensions/domain-rules/api-design/module.json +27 -27
- package/augment-extensions/domain-rules/api-design/rules/authentication.md +263 -263
- package/augment-extensions/domain-rules/api-design/rules/documentation.md +395 -395
- package/augment-extensions/domain-rules/api-design/rules/error-handling.md +290 -290
- package/augment-extensions/domain-rules/api-design/rules/graphql-api.md +313 -313
- package/augment-extensions/domain-rules/api-design/rules/rest-api.md +214 -214
- package/augment-extensions/domain-rules/api-design/rules/versioning.md +268 -268
- package/augment-extensions/domain-rules/database/README.md +161 -161
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -793
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -1132
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -868
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -805
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -621
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -965
- package/augment-extensions/domain-rules/database/module.json +28 -28
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -624
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -588
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -856
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -778
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -963
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -1076
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -697
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -671
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -607
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -907
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -783
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -980
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -485
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -521
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -858
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -934
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/dracula/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/dracula/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/README.md +27 -27
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/monokai/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/monokai/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/nord/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/nord/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/one-dark/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/one-dark/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/one-light/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/one-light/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/module.json +26 -26
- package/augment-extensions/domain-rules/mcp/README.md +150 -150
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -522
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -520
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -570
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -427
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -435
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -502
- package/augment-extensions/domain-rules/mcp/module.json +49 -49
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -595
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -345
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -687
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -636
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -484
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -360
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -393
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -194
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -625
- package/augment-extensions/domain-rules/security/README.md +41 -41
- package/augment-extensions/domain-rules/security/module.json +28 -28
- package/augment-extensions/domain-rules/security/rules/authentication-security.md +361 -361
- package/augment-extensions/domain-rules/security/rules/encryption.md +208 -208
- package/augment-extensions/domain-rules/security/rules/input-validation.md +294 -294
- package/augment-extensions/domain-rules/security/rules/owasp-top-10.md +339 -339
- package/augment-extensions/domain-rules/security/rules/secure-coding.md +293 -293
- package/augment-extensions/domain-rules/security/rules/web-security.md +268 -268
- package/augment-extensions/domain-rules/seo-sales-marketing/ANNOUNCEMENT.md +143 -0
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/README.md +140 -136
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/SCHEMA-VALIDATION-REPORT.md +216 -216
- package/augment-extensions/domain-rules/seo-sales-marketing/TEST-VALIDATION.md +129 -0
- package/augment-extensions/domain-rules/seo-sales-marketing/USAGE-GUIDES.md +254 -0
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/brand-kit-example.yaml +292 -292
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/campaign-brief-example.yaml +389 -389
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/content-calendar-example.yaml +643 -643
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/email-newsletter-example.md +376 -376
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/landing-page-example.md +934 -934
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/ppc-ad-copy-example.md +301 -301
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/seo-blog-post-example.md +347 -347
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/social-media-campaign-example.md +606 -606
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/module.json +50 -50
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/affiliate-influencer-marketing.md +593 -593
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/asset-management.md +418 -418
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/brand-consistency.md +210 -210
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/content-marketing.md +337 -337
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/conversion-optimization.md +455 -455
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/direct-sales.md +499 -499
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/email-marketing.md +439 -439
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/legal-compliance.md +227 -227
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/ppc-advertising.md +569 -569
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/seo-optimization.md +470 -470
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/social-media-marketing.md +414 -414
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/universal-marketing.md +177 -177
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/asset-inventory.schema.json +247 -247
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/brand-kit.schema.json +326 -326
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/campaign-brief.schema.json +342 -342
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/color-palette.schema.json +223 -223
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/content-template.schema.json +383 -383
- package/augment-extensions/domain-rules/wordpress/README.md +163 -163
- package/augment-extensions/domain-rules/wordpress/module.json +32 -32
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -617
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -270
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -423
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -493
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -568
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -510
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -251
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -501
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -564
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -388
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -441
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -139
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -1599
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -1727
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -428
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -422
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -1623
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -1343
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -734
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -1350
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -503
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -971
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -53
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -770
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -874
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -629
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -559
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -709
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -736
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -1057
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -463
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -478
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -818
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -416
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -667
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -878
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -693
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -352
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -818
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -624
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -866
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -1165
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -414
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -751
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -949
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -458
- package/augment-extensions/examples/design-patterns/README.md +37 -37
- package/augment-extensions/examples/design-patterns/examples/behavioral-patterns.md +370 -370
- package/augment-extensions/examples/design-patterns/examples/creational-patterns.md +250 -250
- package/augment-extensions/examples/design-patterns/examples/structural-patterns.md +264 -264
- package/augment-extensions/examples/design-patterns/module.json +27 -27
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -101
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -428
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -40
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -98
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -1299
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -40
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -98
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -763
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -40
- package/augment-extensions/workflows/beads/README.md +135 -135
- package/augment-extensions/workflows/beads/examples/complete-workflow-example.md +278 -278
- package/augment-extensions/workflows/beads/module.json +55 -55
- package/augment-extensions/workflows/beads/rules/best-practices.md +398 -398
- package/augment-extensions/workflows/beads/rules/file-format.md +327 -327
- package/augment-extensions/workflows/beads/rules/manual-setup.md +315 -315
- package/augment-extensions/workflows/beads/rules/workflow.md +326 -326
- package/augment-extensions/workflows/beads-integration/IMPLEMENTATION-STATUS.md +145 -145
- package/augment-extensions/workflows/beads-integration/README.md +143 -143
- package/augment-extensions/workflows/beads-integration/config/defaults.json +32 -32
- package/augment-extensions/workflows/beads-integration/config/schema.json +140 -140
- package/augment-extensions/workflows/beads-integration/examples/basic-task-generation.md +293 -293
- package/augment-extensions/workflows/beads-integration/module.json +75 -75
- package/augment-extensions/workflows/beads-integration/rules/core-rules.md +219 -219
- package/augment-extensions/workflows/beads-integration/rules/effectiveness-standards.md +256 -256
- package/augment-extensions/workflows/beads-integration/rules/task-generation.md +607 -607
- package/augment-extensions/workflows/database/README.md +195 -195
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -295
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -498
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -496
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -444
- package/augment-extensions/workflows/database/module.json +42 -42
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -249
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -339
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -352
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -435
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -535
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -305
- package/augment-extensions/workflows/database/rules/workflow.md +458 -458
- package/augment-extensions/workflows/wordpress-plugin/README.md +232 -232
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -839
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -854
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -540
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -1083
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -669
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -597
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -925
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -752
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -773
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -49
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -942
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -702
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -728
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -775
- package/augment-extensions/writing-standards/screenplay/README.md +339 -300
- package/augment-extensions/writing-standards/screenplay/_templates/README.md +121 -121
- package/augment-extensions/writing-standards/screenplay/_templates/genre-template.md +153 -153
- package/augment-extensions/writing-standards/screenplay/_templates/style-template.md +243 -243
- package/augment-extensions/writing-standards/screenplay/_templates/theme-template.md +213 -213
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -164
- package/augment-extensions/writing-standards/screenplay/examples/beat-sheet-example.yaml +95 -95
- package/augment-extensions/writing-standards/screenplay/examples/character-profile-example.yaml +116 -116
- package/augment-extensions/writing-standards/screenplay/examples/commercial-30sec.fountain +151 -151
- package/augment-extensions/writing-standards/screenplay/examples/independent-monologue.fountain +67 -67
- package/augment-extensions/writing-standards/screenplay/examples/news-segment.fountain +142 -142
- package/augment-extensions/writing-standards/screenplay/examples/plot-outline-example.yaml +184 -184
- package/augment-extensions/writing-standards/screenplay/examples/tv-episode-teaser.fountain +204 -204
- package/augment-extensions/writing-standards/screenplay/genres/README.md +181 -181
- package/augment-extensions/writing-standards/screenplay/genres/examples/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/genres/module.json +70 -70
- package/augment-extensions/writing-standards/screenplay/genres/rules/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/genres/rules/action.md +399 -399
- package/augment-extensions/writing-standards/screenplay/genres/rules/adventure.md +407 -407
- package/augment-extensions/writing-standards/screenplay/genres/rules/animation.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/biographical.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/comedy.md +401 -401
- package/augment-extensions/writing-standards/screenplay/genres/rules/documentary.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/drama.md +409 -409
- package/augment-extensions/writing-standards/screenplay/genres/rules/fantasy.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/historical.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/horror.md +268 -268
- package/augment-extensions/writing-standards/screenplay/genres/rules/musical.md +294 -294
- package/augment-extensions/writing-standards/screenplay/genres/rules/mystery.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/noir.md +294 -294
- package/augment-extensions/writing-standards/screenplay/genres/rules/romance.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/sci-fi.md +289 -289
- package/augment-extensions/writing-standards/screenplay/genres/rules/superhero.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/thriller.md +294 -294
- package/augment-extensions/writing-standards/screenplay/genres/rules/western.md +293 -293
- package/augment-extensions/writing-standards/screenplay/module.json +124 -124
- package/augment-extensions/writing-standards/screenplay/rules/aaa-hollywood-films.md +339 -339
- package/augment-extensions/writing-standards/screenplay/rules/ai-integration-testing.md +329 -329
- package/augment-extensions/writing-standards/screenplay/rules/character-development.md +169 -169
- package/augment-extensions/writing-standards/screenplay/rules/commercials.md +437 -437
- package/augment-extensions/writing-standards/screenplay/rules/dialogue-writing.md +263 -263
- package/augment-extensions/writing-standards/screenplay/rules/diversity-inclusion.md +261 -261
- package/augment-extensions/writing-standards/screenplay/rules/examples-guide.md +315 -315
- package/augment-extensions/writing-standards/screenplay/rules/file-organization.md +213 -0
- package/augment-extensions/writing-standards/screenplay/rules/formatting-validation.md +413 -413
- package/augment-extensions/writing-standards/screenplay/rules/fountain-format.md +372 -372
- package/augment-extensions/writing-standards/screenplay/rules/independent-films.md +374 -374
- package/augment-extensions/writing-standards/screenplay/rules/live-tv-productions.md +443 -443
- package/augment-extensions/writing-standards/screenplay/rules/narrative-structures.md +207 -207
- package/augment-extensions/writing-standards/screenplay/rules/news-broadcasts.md +444 -444
- package/augment-extensions/writing-standards/screenplay/rules/pacing-timing.md +331 -331
- package/augment-extensions/writing-standards/screenplay/rules/quality-review-checklist.md +334 -334
- package/augment-extensions/writing-standards/screenplay/rules/quick-reference.md +299 -299
- package/augment-extensions/writing-standards/screenplay/rules/screen-continuity.md +263 -263
- package/augment-extensions/writing-standards/screenplay/rules/streaming-content.md +412 -412
- package/augment-extensions/writing-standards/screenplay/rules/trope-management.md +370 -370
- package/augment-extensions/writing-standards/screenplay/rules/tv-series.md +374 -374
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -339
- package/augment-extensions/writing-standards/screenplay/rules/vscode-integration.md +277 -277
- package/augment-extensions/writing-standards/screenplay/rules/web-content.md +393 -393
- package/augment-extensions/writing-standards/screenplay/schemas/beat-sheet.json +332 -332
- package/augment-extensions/writing-standards/screenplay/schemas/character-profile.json +247 -247
- package/augment-extensions/writing-standards/screenplay/schemas/feature-selection.json +200 -200
- package/augment-extensions/writing-standards/screenplay/schemas/plot-outline.json +233 -233
- package/augment-extensions/writing-standards/screenplay/schemas/screenplay-config.json +245 -245
- package/augment-extensions/writing-standards/screenplay/schemas/trope-inventory.json +221 -221
- package/augment-extensions/writing-standards/screenplay/styles/README.md +159 -159
- package/augment-extensions/writing-standards/screenplay/styles/examples/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/styles/examples/style-applications.md +1449 -1449
- package/augment-extensions/writing-standards/screenplay/styles/module.json +64 -64
- package/augment-extensions/writing-standards/screenplay/styles/rules/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/styles/rules/dialogue-centric.md +520 -520
- package/augment-extensions/writing-standards/screenplay/styles/rules/ensemble.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/epic.md +497 -497
- package/augment-extensions/writing-standards/screenplay/styles/rules/experimental.md +492 -492
- package/augment-extensions/writing-standards/screenplay/styles/rules/flashback.md +509 -509
- package/augment-extensions/writing-standards/screenplay/styles/rules/linear.md +490 -490
- package/augment-extensions/writing-standards/screenplay/styles/rules/minimalist.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/non-linear.md +501 -501
- package/augment-extensions/writing-standards/screenplay/styles/rules/poetic.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/realistic.md +498 -498
- package/augment-extensions/writing-standards/screenplay/styles/rules/satirical.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/surreal.md +508 -508
- package/augment-extensions/writing-standards/screenplay/styles/rules/voice-over.md +500 -500
- package/augment-extensions/writing-standards/screenplay/themes/README.md +158 -158
- package/augment-extensions/writing-standards/screenplay/themes/examples/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/themes/examples/common-mistakes-and-fixes.md +643 -643
- package/augment-extensions/writing-standards/screenplay/themes/examples/complete-scene-example.md +311 -311
- package/augment-extensions/writing-standards/screenplay/themes/examples/individual-theme-examples.md +562 -562
- package/augment-extensions/writing-standards/screenplay/themes/examples/multi-theme-weaving.md +538 -538
- package/augment-extensions/writing-standards/screenplay/themes/examples/theme-application-guide.md +432 -432
- package/augment-extensions/writing-standards/screenplay/themes/examples/theme-integration-across-acts.md +637 -637
- package/augment-extensions/writing-standards/screenplay/themes/module.json +66 -66
- package/augment-extensions/writing-standards/screenplay/themes/rules/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/themes/rules/ambition.md +458 -458
- package/augment-extensions/writing-standards/screenplay/themes/rules/betrayal.md +490 -490
- package/augment-extensions/writing-standards/screenplay/themes/rules/environment.md +458 -458
- package/augment-extensions/writing-standards/screenplay/themes/rules/fate.md +459 -459
- package/augment-extensions/writing-standards/screenplay/themes/rules/friendship.md +491 -491
- package/augment-extensions/writing-standards/screenplay/themes/rules/growth.md +491 -491
- package/augment-extensions/writing-standards/screenplay/themes/rules/identity.md +490 -490
- package/augment-extensions/writing-standards/screenplay/themes/rules/isolation.md +464 -464
- package/augment-extensions/writing-standards/screenplay/themes/rules/justice.md +461 -461
- package/augment-extensions/writing-standards/screenplay/themes/rules/love.md +489 -489
- package/augment-extensions/writing-standards/screenplay/themes/rules/power.md +494 -494
- package/augment-extensions/writing-standards/screenplay/themes/rules/redemption.md +483 -483
- package/augment-extensions/writing-standards/screenplay/themes/rules/revenge.md +489 -489
- package/augment-extensions/writing-standards/screenplay/themes/rules/survival.md +496 -496
- package/augment-extensions/writing-standards/screenplay/themes/rules/technology.md +463 -463
- package/augment-extensions/writing-standards/screenplay/utils/__tests__/file-organization.test.ts +169 -0
- package/augment-extensions/writing-standards/screenplay/utils/file-organization.ts +165 -0
- package/cli/MODULES.md +302 -302
- package/cli/dist/cli.js +109 -22
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/gui.d.ts.map +1 -1
- package/cli/dist/commands/gui.js +54 -6
- package/cli/dist/commands/gui.js.map +1 -1
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +76 -23
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/self-remove.d.ts.map +1 -1
- package/cli/dist/commands/self-remove.js +48 -74
- package/cli/dist/commands/self-remove.js.map +1 -1
- package/cli/dist/commands/show.d.ts +11 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +120 -0
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/showCompleted.d.ts +21 -0
- package/cli/dist/commands/showCompleted.d.ts.map +1 -0
- package/cli/dist/commands/showCompleted.js +225 -0
- package/cli/dist/commands/showCompleted.js.map +1 -0
- package/cli/dist/commands/skill.js +88 -88
- package/cli/dist/commands/update.d.ts +2 -0
- package/cli/dist/commands/update.d.ts.map +1 -1
- package/cli/dist/commands/update.js +67 -1
- package/cli/dist/commands/update.js.map +1 -1
- package/cli/dist/utils/beadsCompletedChecker.d.ts +72 -0
- package/cli/dist/utils/beadsCompletedChecker.d.ts.map +1 -0
- package/cli/dist/utils/beadsCompletedChecker.js +198 -0
- package/cli/dist/utils/beadsCompletedChecker.js.map +1 -0
- package/cli/dist/utils/catalog-sync.js +13 -13
- package/cli/dist/utils/extractCommandHelp.d.ts +51 -0
- package/cli/dist/utils/extractCommandHelp.d.ts.map +1 -0
- package/cli/dist/utils/extractCommandHelp.js +250 -0
- package/cli/dist/utils/extractCommandHelp.js.map +1 -0
- package/cli/dist/utils/install-rules.js +55 -55
- package/cli/dist/utils/mcp-integration.js +44 -44
- package/cli/dist/utils/rule-install-hooks.js +8 -8
- package/modules.md +667 -630
- package/package.json +85 -85
|
@@ -1,373 +1,373 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Python Best Practices Examples
|
|
3
|
-
|
|
4
|
-
This module demonstrates Python coding best practices including:
|
|
5
|
-
- Naming conventions (PEP 8)
|
|
6
|
-
- Type hints (PEP 484, 585, 604)
|
|
7
|
-
- Error handling
|
|
8
|
-
- Async patterns
|
|
9
|
-
- Code organization
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
from __future__ import annotations
|
|
13
|
-
|
|
14
|
-
import asyncio
|
|
15
|
-
import logging
|
|
16
|
-
from collections.abc import Callable, Iterator
|
|
17
|
-
from contextlib import contextmanager
|
|
18
|
-
from dataclasses import dataclass
|
|
19
|
-
from enum import Enum
|
|
20
|
-
from pathlib import Path
|
|
21
|
-
from typing import Any, Protocol
|
|
22
|
-
|
|
23
|
-
# Configure logging
|
|
24
|
-
logger = logging.getLogger(__name__)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
# ============================================================================
|
|
28
|
-
# NAMING CONVENTIONS (PEP 8)
|
|
29
|
-
# ============================================================================
|
|
30
|
-
|
|
31
|
-
# Constants: UPPER_SNAKE_CASE
|
|
32
|
-
MAX_RETRY_ATTEMPTS = 3
|
|
33
|
-
DEFAULT_TIMEOUT = 30
|
|
34
|
-
API_BASE_URL = "https://api.example.com"
|
|
35
|
-
|
|
36
|
-
# Classes: PascalCase
|
|
37
|
-
class UserAccount:
|
|
38
|
-
"""Represents a user account"""
|
|
39
|
-
pass
|
|
40
|
-
|
|
41
|
-
class HTTPClient:
|
|
42
|
-
"""HTTP client for API requests"""
|
|
43
|
-
pass
|
|
44
|
-
|
|
45
|
-
# Functions and variables: snake_case
|
|
46
|
-
def calculate_total_price(items: list[dict[str, Any]]) -> float:
|
|
47
|
-
"""Calculate total price from list of items"""
|
|
48
|
-
return sum(item.get("price", 0.0) for item in items)
|
|
49
|
-
|
|
50
|
-
# Private attributes: _leading_underscore
|
|
51
|
-
class BankAccount:
|
|
52
|
-
def __init__(self, account_number: str, balance: float) -> None:
|
|
53
|
-
self.account_number = account_number
|
|
54
|
-
self._balance = balance # Private attribute
|
|
55
|
-
|
|
56
|
-
def get_balance(self) -> float:
|
|
57
|
-
"""Public method to access private balance"""
|
|
58
|
-
return self._balance
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
# ============================================================================
|
|
62
|
-
# TYPE HINTS (PEP 484, 585, 604)
|
|
63
|
-
# ============================================================================
|
|
64
|
-
|
|
65
|
-
# Modern collection types (Python 3.10+, PEP 585)
|
|
66
|
-
def process_user_data(
|
|
67
|
-
users: list[dict[str, Any]]
|
|
68
|
-
) -> dict[str, list[str]]:
|
|
69
|
-
"""Process user data and return grouped by role"""
|
|
70
|
-
result: dict[str, list[str]] = {}
|
|
71
|
-
for user in users:
|
|
72
|
-
role = user.get("role", "unknown")
|
|
73
|
-
if role not in result:
|
|
74
|
-
result[role] = []
|
|
75
|
-
result[role].append(user["name"])
|
|
76
|
-
return result
|
|
77
|
-
|
|
78
|
-
# Union types with | operator (Python 3.10+, PEP 604)
|
|
79
|
-
def find_user(user_id: int) -> dict[str, Any] | None:
|
|
80
|
-
"""Find user by ID, returns None if not found"""
|
|
81
|
-
# Simulated database lookup
|
|
82
|
-
return None
|
|
83
|
-
|
|
84
|
-
# Optional parameters with default values
|
|
85
|
-
def create_user(
|
|
86
|
-
username: str,
|
|
87
|
-
email: str,
|
|
88
|
-
age: int | None = None,
|
|
89
|
-
is_active: bool = True
|
|
90
|
-
) -> dict[str, Any]:
|
|
91
|
-
"""Create a new user with optional age"""
|
|
92
|
-
return {
|
|
93
|
-
"username": username,
|
|
94
|
-
"email": email,
|
|
95
|
-
"age": age,
|
|
96
|
-
"is_active": is_active
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
# Callable type hints
|
|
100
|
-
def apply_operation(
|
|
101
|
-
value: int,
|
|
102
|
-
operation: Callable[[int], int]
|
|
103
|
-
) -> int:
|
|
104
|
-
"""Apply an operation function to a value"""
|
|
105
|
-
return operation(value)
|
|
106
|
-
|
|
107
|
-
# Protocol for structural subtyping
|
|
108
|
-
class Drawable(Protocol):
|
|
109
|
-
"""Protocol for objects that can be drawn"""
|
|
110
|
-
def draw(self) -> None:
|
|
111
|
-
"""Draw the object"""
|
|
112
|
-
...
|
|
113
|
-
|
|
114
|
-
def render(obj: Drawable) -> None:
|
|
115
|
-
"""Render any drawable object"""
|
|
116
|
-
obj.draw()
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
# ============================================================================
|
|
120
|
-
# DATACLASSES
|
|
121
|
-
# ============================================================================
|
|
122
|
-
|
|
123
|
-
@dataclass
|
|
124
|
-
class User:
|
|
125
|
-
"""User model using dataclass"""
|
|
126
|
-
username: str
|
|
127
|
-
email: str
|
|
128
|
-
age: int | None = None
|
|
129
|
-
is_active: bool = True
|
|
130
|
-
|
|
131
|
-
def __post_init__(self) -> None:
|
|
132
|
-
"""Validate data after initialization"""
|
|
133
|
-
if not self.email or "@" not in self.email:
|
|
134
|
-
raise ValueError(f"Invalid email: {self.email}")
|
|
135
|
-
if self.age is not None and self.age < 0:
|
|
136
|
-
raise ValueError(f"Age cannot be negative: {self.age}")
|
|
137
|
-
|
|
138
|
-
@dataclass(frozen=True)
|
|
139
|
-
class Point:
|
|
140
|
-
"""Immutable point using frozen dataclass"""
|
|
141
|
-
x: float
|
|
142
|
-
y: float
|
|
143
|
-
|
|
144
|
-
def distance_from_origin(self) -> float:
|
|
145
|
-
"""Calculate distance from origin"""
|
|
146
|
-
return (self.x ** 2 + self.y ** 2) ** 0.5
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
# ============================================================================
|
|
150
|
-
# ENUMS
|
|
151
|
-
# ============================================================================
|
|
152
|
-
|
|
153
|
-
class UserRole(Enum):
|
|
154
|
-
"""User role enumeration"""
|
|
155
|
-
ADMIN = "admin"
|
|
156
|
-
MODERATOR = "moderator"
|
|
157
|
-
USER = "user"
|
|
158
|
-
GUEST = "guest"
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
# ============================================================================
|
|
162
|
-
# ERROR HANDLING
|
|
163
|
-
# ============================================================================
|
|
164
|
-
|
|
165
|
-
class ValidationError(Exception):
|
|
166
|
-
"""Custom exception for validation errors"""
|
|
167
|
-
pass
|
|
168
|
-
|
|
169
|
-
class UserNotFoundError(Exception):
|
|
170
|
-
"""Custom exception for user not found"""
|
|
171
|
-
pass
|
|
172
|
-
|
|
173
|
-
def validate_email(email: str) -> None:
|
|
174
|
-
"""Validate email format, raises ValidationError if invalid"""
|
|
175
|
-
if not email or "@" not in email:
|
|
176
|
-
raise ValidationError(f"Invalid email format: {email}")
|
|
177
|
-
|
|
178
|
-
def get_user_by_id(user_id: int) -> dict[str, Any]:
|
|
179
|
-
"""Get user by ID with proper error handling"""
|
|
180
|
-
try:
|
|
181
|
-
# Simulated database call
|
|
182
|
-
user = find_user(user_id)
|
|
183
|
-
if user is None:
|
|
184
|
-
raise UserNotFoundError(f"User {user_id} not found")
|
|
185
|
-
return user
|
|
186
|
-
except UserNotFoundError:
|
|
187
|
-
logger.error(f"User {user_id} not found")
|
|
188
|
-
raise
|
|
189
|
-
except Exception as e:
|
|
190
|
-
logger.exception(f"Unexpected error fetching user {user_id}")
|
|
191
|
-
raise RuntimeError(f"Failed to fetch user: {e}") from e
|
|
192
|
-
|
|
193
|
-
# Context manager for resource management
|
|
194
|
-
@contextmanager
|
|
195
|
-
def open_database_connection(db_path: str) -> Iterator[Any]:
|
|
196
|
-
"""Context manager for database connection"""
|
|
197
|
-
connection = None
|
|
198
|
-
try:
|
|
199
|
-
# Simulated connection
|
|
200
|
-
connection = f"Connection to {db_path}"
|
|
201
|
-
logger.info(f"Opened database connection: {db_path}")
|
|
202
|
-
yield connection
|
|
203
|
-
except Exception as e:
|
|
204
|
-
logger.error(f"Database error: {e}")
|
|
205
|
-
raise
|
|
206
|
-
finally:
|
|
207
|
-
if connection:
|
|
208
|
-
logger.info(f"Closed database connection: {db_path}")
|
|
209
|
-
|
|
210
|
-
# Using context manager
|
|
211
|
-
def query_database(db_path: str, query: str) -> list[dict[str, Any]]:
|
|
212
|
-
"""Query database using context manager"""
|
|
213
|
-
with open_database_connection(db_path) as conn:
|
|
214
|
-
# Execute query
|
|
215
|
-
logger.info(f"Executing query: {query}")
|
|
216
|
-
return []
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
# ============================================================================
|
|
220
|
-
# ASYNC PATTERNS
|
|
221
|
-
# ============================================================================
|
|
222
|
-
|
|
223
|
-
async def fetch_user_async(user_id: int) -> dict[str, Any] | None:
|
|
224
|
-
"""Async function to fetch user data"""
|
|
225
|
-
await asyncio.sleep(0.1) # Simulate network delay
|
|
226
|
-
return {"id": user_id, "name": f"User {user_id}"}
|
|
227
|
-
|
|
228
|
-
async def fetch_multiple_users(user_ids: list[int]) -> list[dict[str, Any]]:
|
|
229
|
-
"""Fetch multiple users concurrently"""
|
|
230
|
-
tasks = [fetch_user_async(user_id) for user_id in user_ids]
|
|
231
|
-
results = await asyncio.gather(*tasks)
|
|
232
|
-
return [user for user in results if user is not None]
|
|
233
|
-
|
|
234
|
-
async def process_with_timeout(user_id: int, timeout: float = 5.0) -> dict[str, Any] | None:
|
|
235
|
-
"""Process with timeout"""
|
|
236
|
-
try:
|
|
237
|
-
return await asyncio.wait_for(
|
|
238
|
-
fetch_user_async(user_id),
|
|
239
|
-
timeout=timeout
|
|
240
|
-
)
|
|
241
|
-
except asyncio.TimeoutError:
|
|
242
|
-
logger.warning(f"Timeout fetching user {user_id}")
|
|
243
|
-
return None
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
# ============================================================================
|
|
247
|
-
# CODE ORGANIZATION
|
|
248
|
-
# ============================================================================
|
|
249
|
-
|
|
250
|
-
class UserService:
|
|
251
|
-
"""Service class for user operations"""
|
|
252
|
-
|
|
253
|
-
def __init__(self, db_path: str) -> None:
|
|
254
|
-
self._db_path = db_path
|
|
255
|
-
self._cache: dict[int, dict[str, Any]] = {}
|
|
256
|
-
|
|
257
|
-
def get_user(self, user_id: int) -> dict[str, Any] | None:
|
|
258
|
-
"""Get user from cache or database"""
|
|
259
|
-
if user_id in self._cache:
|
|
260
|
-
return self._cache[user_id]
|
|
261
|
-
|
|
262
|
-
user = find_user(user_id)
|
|
263
|
-
if user:
|
|
264
|
-
self._cache[user_id] = user
|
|
265
|
-
return user
|
|
266
|
-
|
|
267
|
-
def create_user(self, username: str, email: str) -> dict[str, Any]:
|
|
268
|
-
"""Create a new user"""
|
|
269
|
-
validate_email(email)
|
|
270
|
-
user = {
|
|
271
|
-
"id": len(self._cache) + 1,
|
|
272
|
-
"username": username,
|
|
273
|
-
"email": email
|
|
274
|
-
}
|
|
275
|
-
self._cache[user["id"]] = user
|
|
276
|
-
return user
|
|
277
|
-
|
|
278
|
-
def clear_cache(self) -> None:
|
|
279
|
-
"""Clear the user cache"""
|
|
280
|
-
self._cache.clear()
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
# ============================================================================
|
|
284
|
-
# BEST PRACTICES EXAMPLES
|
|
285
|
-
# ============================================================================
|
|
286
|
-
|
|
287
|
-
# Use list comprehensions instead of loops
|
|
288
|
-
def get_active_users(users: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
289
|
-
"""Get all active users using list comprehension"""
|
|
290
|
-
return [user for user in users if user.get("is_active", False)]
|
|
291
|
-
|
|
292
|
-
# Use dict comprehensions
|
|
293
|
-
def create_user_lookup(users: list[dict[str, Any]]) -> dict[int, str]:
|
|
294
|
-
"""Create user ID to name lookup using dict comprehension"""
|
|
295
|
-
return {user["id"]: user["name"] for user in users if "id" in user}
|
|
296
|
-
|
|
297
|
-
# Use enumerate instead of range(len())
|
|
298
|
-
def print_users_with_index(users: list[str]) -> None:
|
|
299
|
-
"""Print users with index using enumerate"""
|
|
300
|
-
for index, user in enumerate(users, start=1):
|
|
301
|
-
print(f"{index}. {user}")
|
|
302
|
-
|
|
303
|
-
# Use zip for parallel iteration
|
|
304
|
-
def combine_data(names: list[str], ages: list[int]) -> list[dict[str, Any]]:
|
|
305
|
-
"""Combine parallel lists using zip"""
|
|
306
|
-
return [{"name": name, "age": age} for name, age in zip(names, ages)]
|
|
307
|
-
|
|
308
|
-
# Use pathlib instead of os.path
|
|
309
|
-
def read_config_file(config_name: str) -> str:
|
|
310
|
-
"""Read config file using pathlib"""
|
|
311
|
-
config_path = Path(__file__).parent / "config" / f"{config_name}.json"
|
|
312
|
-
if not config_path.exists():
|
|
313
|
-
raise FileNotFoundError(f"Config file not found: {config_path}")
|
|
314
|
-
return config_path.read_text()
|
|
315
|
-
|
|
316
|
-
# Use f-strings for formatting
|
|
317
|
-
def format_user_info(user: dict[str, Any]) -> str:
|
|
318
|
-
"""Format user info using f-strings"""
|
|
319
|
-
name = user.get("name", "Unknown")
|
|
320
|
-
age = user.get("age", "N/A")
|
|
321
|
-
return f"User: {name}, Age: {age}"
|
|
322
|
-
|
|
323
|
-
# Use walrus operator for assignment in expressions (Python 3.8+)
|
|
324
|
-
def process_data(data: list[str]) -> list[str]:
|
|
325
|
-
"""Process data using walrus operator"""
|
|
326
|
-
results = []
|
|
327
|
-
for item in data:
|
|
328
|
-
if (processed := item.strip().upper()):
|
|
329
|
-
results.append(processed)
|
|
330
|
-
return results
|
|
331
|
-
|
|
332
|
-
# Use match-case for pattern matching (Python 3.10+)
|
|
333
|
-
def handle_response(status_code: int) -> str:
|
|
334
|
-
"""Handle HTTP response using match-case"""
|
|
335
|
-
match status_code:
|
|
336
|
-
case 200:
|
|
337
|
-
return "Success"
|
|
338
|
-
case 404:
|
|
339
|
-
return "Not Found"
|
|
340
|
-
case 500:
|
|
341
|
-
return "Server Error"
|
|
342
|
-
case _:
|
|
343
|
-
return f"Unknown status: {status_code}"
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
# ============================================================================
|
|
347
|
-
# MAIN EXECUTION
|
|
348
|
-
# ============================================================================
|
|
349
|
-
|
|
350
|
-
def main() -> None:
|
|
351
|
-
"""Main function demonstrating best practices"""
|
|
352
|
-
# Create users
|
|
353
|
-
user1 = User(username="alice", email="alice@example.com", age=30)
|
|
354
|
-
user2 = User(username="bob", email="bob@example.com")
|
|
355
|
-
|
|
356
|
-
print(f"Created users: {user1}, {user2}")
|
|
357
|
-
|
|
358
|
-
# Use service
|
|
359
|
-
service = UserService(db_path="users.db")
|
|
360
|
-
new_user = service.create_user("charlie", "charlie@example.com")
|
|
361
|
-
print(f"Created user via service: {new_user}")
|
|
362
|
-
|
|
363
|
-
# Demonstrate async
|
|
364
|
-
async def run_async_example() -> None:
|
|
365
|
-
users = await fetch_multiple_users([1, 2, 3])
|
|
366
|
-
print(f"Fetched users: {users}")
|
|
367
|
-
|
|
368
|
-
asyncio.run(run_async_example())
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
if __name__ == "__main__":
|
|
372
|
-
main()
|
|
373
|
-
|
|
1
|
+
"""
|
|
2
|
+
Python Best Practices Examples
|
|
3
|
+
|
|
4
|
+
This module demonstrates Python coding best practices including:
|
|
5
|
+
- Naming conventions (PEP 8)
|
|
6
|
+
- Type hints (PEP 484, 585, 604)
|
|
7
|
+
- Error handling
|
|
8
|
+
- Async patterns
|
|
9
|
+
- Code organization
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import asyncio
|
|
15
|
+
import logging
|
|
16
|
+
from collections.abc import Callable, Iterator
|
|
17
|
+
from contextlib import contextmanager
|
|
18
|
+
from dataclasses import dataclass
|
|
19
|
+
from enum import Enum
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from typing import Any, Protocol
|
|
22
|
+
|
|
23
|
+
# Configure logging
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# ============================================================================
|
|
28
|
+
# NAMING CONVENTIONS (PEP 8)
|
|
29
|
+
# ============================================================================
|
|
30
|
+
|
|
31
|
+
# Constants: UPPER_SNAKE_CASE
|
|
32
|
+
MAX_RETRY_ATTEMPTS = 3
|
|
33
|
+
DEFAULT_TIMEOUT = 30
|
|
34
|
+
API_BASE_URL = "https://api.example.com"
|
|
35
|
+
|
|
36
|
+
# Classes: PascalCase
|
|
37
|
+
class UserAccount:
|
|
38
|
+
"""Represents a user account"""
|
|
39
|
+
pass
|
|
40
|
+
|
|
41
|
+
class HTTPClient:
|
|
42
|
+
"""HTTP client for API requests"""
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
# Functions and variables: snake_case
|
|
46
|
+
def calculate_total_price(items: list[dict[str, Any]]) -> float:
|
|
47
|
+
"""Calculate total price from list of items"""
|
|
48
|
+
return sum(item.get("price", 0.0) for item in items)
|
|
49
|
+
|
|
50
|
+
# Private attributes: _leading_underscore
|
|
51
|
+
class BankAccount:
|
|
52
|
+
def __init__(self, account_number: str, balance: float) -> None:
|
|
53
|
+
self.account_number = account_number
|
|
54
|
+
self._balance = balance # Private attribute
|
|
55
|
+
|
|
56
|
+
def get_balance(self) -> float:
|
|
57
|
+
"""Public method to access private balance"""
|
|
58
|
+
return self._balance
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# ============================================================================
|
|
62
|
+
# TYPE HINTS (PEP 484, 585, 604)
|
|
63
|
+
# ============================================================================
|
|
64
|
+
|
|
65
|
+
# Modern collection types (Python 3.10+, PEP 585)
|
|
66
|
+
def process_user_data(
|
|
67
|
+
users: list[dict[str, Any]]
|
|
68
|
+
) -> dict[str, list[str]]:
|
|
69
|
+
"""Process user data and return grouped by role"""
|
|
70
|
+
result: dict[str, list[str]] = {}
|
|
71
|
+
for user in users:
|
|
72
|
+
role = user.get("role", "unknown")
|
|
73
|
+
if role not in result:
|
|
74
|
+
result[role] = []
|
|
75
|
+
result[role].append(user["name"])
|
|
76
|
+
return result
|
|
77
|
+
|
|
78
|
+
# Union types with | operator (Python 3.10+, PEP 604)
|
|
79
|
+
def find_user(user_id: int) -> dict[str, Any] | None:
|
|
80
|
+
"""Find user by ID, returns None if not found"""
|
|
81
|
+
# Simulated database lookup
|
|
82
|
+
return None
|
|
83
|
+
|
|
84
|
+
# Optional parameters with default values
|
|
85
|
+
def create_user(
|
|
86
|
+
username: str,
|
|
87
|
+
email: str,
|
|
88
|
+
age: int | None = None,
|
|
89
|
+
is_active: bool = True
|
|
90
|
+
) -> dict[str, Any]:
|
|
91
|
+
"""Create a new user with optional age"""
|
|
92
|
+
return {
|
|
93
|
+
"username": username,
|
|
94
|
+
"email": email,
|
|
95
|
+
"age": age,
|
|
96
|
+
"is_active": is_active
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
# Callable type hints
|
|
100
|
+
def apply_operation(
|
|
101
|
+
value: int,
|
|
102
|
+
operation: Callable[[int], int]
|
|
103
|
+
) -> int:
|
|
104
|
+
"""Apply an operation function to a value"""
|
|
105
|
+
return operation(value)
|
|
106
|
+
|
|
107
|
+
# Protocol for structural subtyping
|
|
108
|
+
class Drawable(Protocol):
|
|
109
|
+
"""Protocol for objects that can be drawn"""
|
|
110
|
+
def draw(self) -> None:
|
|
111
|
+
"""Draw the object"""
|
|
112
|
+
...
|
|
113
|
+
|
|
114
|
+
def render(obj: Drawable) -> None:
|
|
115
|
+
"""Render any drawable object"""
|
|
116
|
+
obj.draw()
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
# ============================================================================
|
|
120
|
+
# DATACLASSES
|
|
121
|
+
# ============================================================================
|
|
122
|
+
|
|
123
|
+
@dataclass
|
|
124
|
+
class User:
|
|
125
|
+
"""User model using dataclass"""
|
|
126
|
+
username: str
|
|
127
|
+
email: str
|
|
128
|
+
age: int | None = None
|
|
129
|
+
is_active: bool = True
|
|
130
|
+
|
|
131
|
+
def __post_init__(self) -> None:
|
|
132
|
+
"""Validate data after initialization"""
|
|
133
|
+
if not self.email or "@" not in self.email:
|
|
134
|
+
raise ValueError(f"Invalid email: {self.email}")
|
|
135
|
+
if self.age is not None and self.age < 0:
|
|
136
|
+
raise ValueError(f"Age cannot be negative: {self.age}")
|
|
137
|
+
|
|
138
|
+
@dataclass(frozen=True)
|
|
139
|
+
class Point:
|
|
140
|
+
"""Immutable point using frozen dataclass"""
|
|
141
|
+
x: float
|
|
142
|
+
y: float
|
|
143
|
+
|
|
144
|
+
def distance_from_origin(self) -> float:
|
|
145
|
+
"""Calculate distance from origin"""
|
|
146
|
+
return (self.x ** 2 + self.y ** 2) ** 0.5
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
# ============================================================================
|
|
150
|
+
# ENUMS
|
|
151
|
+
# ============================================================================
|
|
152
|
+
|
|
153
|
+
class UserRole(Enum):
|
|
154
|
+
"""User role enumeration"""
|
|
155
|
+
ADMIN = "admin"
|
|
156
|
+
MODERATOR = "moderator"
|
|
157
|
+
USER = "user"
|
|
158
|
+
GUEST = "guest"
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
# ============================================================================
|
|
162
|
+
# ERROR HANDLING
|
|
163
|
+
# ============================================================================
|
|
164
|
+
|
|
165
|
+
class ValidationError(Exception):
|
|
166
|
+
"""Custom exception for validation errors"""
|
|
167
|
+
pass
|
|
168
|
+
|
|
169
|
+
class UserNotFoundError(Exception):
|
|
170
|
+
"""Custom exception for user not found"""
|
|
171
|
+
pass
|
|
172
|
+
|
|
173
|
+
def validate_email(email: str) -> None:
|
|
174
|
+
"""Validate email format, raises ValidationError if invalid"""
|
|
175
|
+
if not email or "@" not in email:
|
|
176
|
+
raise ValidationError(f"Invalid email format: {email}")
|
|
177
|
+
|
|
178
|
+
def get_user_by_id(user_id: int) -> dict[str, Any]:
|
|
179
|
+
"""Get user by ID with proper error handling"""
|
|
180
|
+
try:
|
|
181
|
+
# Simulated database call
|
|
182
|
+
user = find_user(user_id)
|
|
183
|
+
if user is None:
|
|
184
|
+
raise UserNotFoundError(f"User {user_id} not found")
|
|
185
|
+
return user
|
|
186
|
+
except UserNotFoundError:
|
|
187
|
+
logger.error(f"User {user_id} not found")
|
|
188
|
+
raise
|
|
189
|
+
except Exception as e:
|
|
190
|
+
logger.exception(f"Unexpected error fetching user {user_id}")
|
|
191
|
+
raise RuntimeError(f"Failed to fetch user: {e}") from e
|
|
192
|
+
|
|
193
|
+
# Context manager for resource management
|
|
194
|
+
@contextmanager
|
|
195
|
+
def open_database_connection(db_path: str) -> Iterator[Any]:
|
|
196
|
+
"""Context manager for database connection"""
|
|
197
|
+
connection = None
|
|
198
|
+
try:
|
|
199
|
+
# Simulated connection
|
|
200
|
+
connection = f"Connection to {db_path}"
|
|
201
|
+
logger.info(f"Opened database connection: {db_path}")
|
|
202
|
+
yield connection
|
|
203
|
+
except Exception as e:
|
|
204
|
+
logger.error(f"Database error: {e}")
|
|
205
|
+
raise
|
|
206
|
+
finally:
|
|
207
|
+
if connection:
|
|
208
|
+
logger.info(f"Closed database connection: {db_path}")
|
|
209
|
+
|
|
210
|
+
# Using context manager
|
|
211
|
+
def query_database(db_path: str, query: str) -> list[dict[str, Any]]:
|
|
212
|
+
"""Query database using context manager"""
|
|
213
|
+
with open_database_connection(db_path) as conn:
|
|
214
|
+
# Execute query
|
|
215
|
+
logger.info(f"Executing query: {query}")
|
|
216
|
+
return []
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
# ============================================================================
|
|
220
|
+
# ASYNC PATTERNS
|
|
221
|
+
# ============================================================================
|
|
222
|
+
|
|
223
|
+
async def fetch_user_async(user_id: int) -> dict[str, Any] | None:
|
|
224
|
+
"""Async function to fetch user data"""
|
|
225
|
+
await asyncio.sleep(0.1) # Simulate network delay
|
|
226
|
+
return {"id": user_id, "name": f"User {user_id}"}
|
|
227
|
+
|
|
228
|
+
async def fetch_multiple_users(user_ids: list[int]) -> list[dict[str, Any]]:
|
|
229
|
+
"""Fetch multiple users concurrently"""
|
|
230
|
+
tasks = [fetch_user_async(user_id) for user_id in user_ids]
|
|
231
|
+
results = await asyncio.gather(*tasks)
|
|
232
|
+
return [user for user in results if user is not None]
|
|
233
|
+
|
|
234
|
+
async def process_with_timeout(user_id: int, timeout: float = 5.0) -> dict[str, Any] | None:
|
|
235
|
+
"""Process with timeout"""
|
|
236
|
+
try:
|
|
237
|
+
return await asyncio.wait_for(
|
|
238
|
+
fetch_user_async(user_id),
|
|
239
|
+
timeout=timeout
|
|
240
|
+
)
|
|
241
|
+
except asyncio.TimeoutError:
|
|
242
|
+
logger.warning(f"Timeout fetching user {user_id}")
|
|
243
|
+
return None
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
# ============================================================================
|
|
247
|
+
# CODE ORGANIZATION
|
|
248
|
+
# ============================================================================
|
|
249
|
+
|
|
250
|
+
class UserService:
|
|
251
|
+
"""Service class for user operations"""
|
|
252
|
+
|
|
253
|
+
def __init__(self, db_path: str) -> None:
|
|
254
|
+
self._db_path = db_path
|
|
255
|
+
self._cache: dict[int, dict[str, Any]] = {}
|
|
256
|
+
|
|
257
|
+
def get_user(self, user_id: int) -> dict[str, Any] | None:
|
|
258
|
+
"""Get user from cache or database"""
|
|
259
|
+
if user_id in self._cache:
|
|
260
|
+
return self._cache[user_id]
|
|
261
|
+
|
|
262
|
+
user = find_user(user_id)
|
|
263
|
+
if user:
|
|
264
|
+
self._cache[user_id] = user
|
|
265
|
+
return user
|
|
266
|
+
|
|
267
|
+
def create_user(self, username: str, email: str) -> dict[str, Any]:
|
|
268
|
+
"""Create a new user"""
|
|
269
|
+
validate_email(email)
|
|
270
|
+
user = {
|
|
271
|
+
"id": len(self._cache) + 1,
|
|
272
|
+
"username": username,
|
|
273
|
+
"email": email
|
|
274
|
+
}
|
|
275
|
+
self._cache[user["id"]] = user
|
|
276
|
+
return user
|
|
277
|
+
|
|
278
|
+
def clear_cache(self) -> None:
|
|
279
|
+
"""Clear the user cache"""
|
|
280
|
+
self._cache.clear()
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
# ============================================================================
|
|
284
|
+
# BEST PRACTICES EXAMPLES
|
|
285
|
+
# ============================================================================
|
|
286
|
+
|
|
287
|
+
# Use list comprehensions instead of loops
|
|
288
|
+
def get_active_users(users: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
289
|
+
"""Get all active users using list comprehension"""
|
|
290
|
+
return [user for user in users if user.get("is_active", False)]
|
|
291
|
+
|
|
292
|
+
# Use dict comprehensions
|
|
293
|
+
def create_user_lookup(users: list[dict[str, Any]]) -> dict[int, str]:
|
|
294
|
+
"""Create user ID to name lookup using dict comprehension"""
|
|
295
|
+
return {user["id"]: user["name"] for user in users if "id" in user}
|
|
296
|
+
|
|
297
|
+
# Use enumerate instead of range(len())
|
|
298
|
+
def print_users_with_index(users: list[str]) -> None:
|
|
299
|
+
"""Print users with index using enumerate"""
|
|
300
|
+
for index, user in enumerate(users, start=1):
|
|
301
|
+
print(f"{index}. {user}")
|
|
302
|
+
|
|
303
|
+
# Use zip for parallel iteration
|
|
304
|
+
def combine_data(names: list[str], ages: list[int]) -> list[dict[str, Any]]:
|
|
305
|
+
"""Combine parallel lists using zip"""
|
|
306
|
+
return [{"name": name, "age": age} for name, age in zip(names, ages)]
|
|
307
|
+
|
|
308
|
+
# Use pathlib instead of os.path
|
|
309
|
+
def read_config_file(config_name: str) -> str:
|
|
310
|
+
"""Read config file using pathlib"""
|
|
311
|
+
config_path = Path(__file__).parent / "config" / f"{config_name}.json"
|
|
312
|
+
if not config_path.exists():
|
|
313
|
+
raise FileNotFoundError(f"Config file not found: {config_path}")
|
|
314
|
+
return config_path.read_text()
|
|
315
|
+
|
|
316
|
+
# Use f-strings for formatting
|
|
317
|
+
def format_user_info(user: dict[str, Any]) -> str:
|
|
318
|
+
"""Format user info using f-strings"""
|
|
319
|
+
name = user.get("name", "Unknown")
|
|
320
|
+
age = user.get("age", "N/A")
|
|
321
|
+
return f"User: {name}, Age: {age}"
|
|
322
|
+
|
|
323
|
+
# Use walrus operator for assignment in expressions (Python 3.8+)
|
|
324
|
+
def process_data(data: list[str]) -> list[str]:
|
|
325
|
+
"""Process data using walrus operator"""
|
|
326
|
+
results = []
|
|
327
|
+
for item in data:
|
|
328
|
+
if (processed := item.strip().upper()):
|
|
329
|
+
results.append(processed)
|
|
330
|
+
return results
|
|
331
|
+
|
|
332
|
+
# Use match-case for pattern matching (Python 3.10+)
|
|
333
|
+
def handle_response(status_code: int) -> str:
|
|
334
|
+
"""Handle HTTP response using match-case"""
|
|
335
|
+
match status_code:
|
|
336
|
+
case 200:
|
|
337
|
+
return "Success"
|
|
338
|
+
case 404:
|
|
339
|
+
return "Not Found"
|
|
340
|
+
case 500:
|
|
341
|
+
return "Server Error"
|
|
342
|
+
case _:
|
|
343
|
+
return f"Unknown status: {status_code}"
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
# ============================================================================
|
|
347
|
+
# MAIN EXECUTION
|
|
348
|
+
# ============================================================================
|
|
349
|
+
|
|
350
|
+
def main() -> None:
|
|
351
|
+
"""Main function demonstrating best practices"""
|
|
352
|
+
# Create users
|
|
353
|
+
user1 = User(username="alice", email="alice@example.com", age=30)
|
|
354
|
+
user2 = User(username="bob", email="bob@example.com")
|
|
355
|
+
|
|
356
|
+
print(f"Created users: {user1}, {user2}")
|
|
357
|
+
|
|
358
|
+
# Use service
|
|
359
|
+
service = UserService(db_path="users.db")
|
|
360
|
+
new_user = service.create_user("charlie", "charlie@example.com")
|
|
361
|
+
print(f"Created user via service: {new_user}")
|
|
362
|
+
|
|
363
|
+
# Demonstrate async
|
|
364
|
+
async def run_async_example() -> None:
|
|
365
|
+
users = await fetch_multiple_users([1, 2, 3])
|
|
366
|
+
print(f"Fetched users: {users}")
|
|
367
|
+
|
|
368
|
+
asyncio.run(run_async_example())
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
if __name__ == "__main__":
|
|
372
|
+
main()
|
|
373
|
+
|