@bernierllc/email 1.0.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.
Files changed (53) hide show
  1. package/.eslintrc.json +112 -0
  2. package/.flake8 +18 -0
  3. package/.github/workflows/ci.yml +300 -0
  4. package/EXTRACTION_SUMMARY.md +265 -0
  5. package/IMPLEMENTATION_STATUS.md +159 -0
  6. package/LICENSE +7 -0
  7. package/OPEN_SOURCE_SETUP.md +420 -0
  8. package/PACKAGE_USAGE.md +471 -0
  9. package/README.md +232 -0
  10. package/examples/fastapi-example/main.py +257 -0
  11. package/examples/nextjs-example/next-env.d.ts +13 -0
  12. package/examples/nextjs-example/package.json +26 -0
  13. package/examples/nextjs-example/pages/admin/templates.tsx +157 -0
  14. package/examples/nextjs-example/tsconfig.json +28 -0
  15. package/package.json +32 -0
  16. package/packages/core/package.json +70 -0
  17. package/packages/core/rollup.config.js +37 -0
  18. package/packages/core/specification.md +416 -0
  19. package/packages/core/src/adapters/supabase.ts +291 -0
  20. package/packages/core/src/core/scheduler.ts +356 -0
  21. package/packages/core/src/core/template-manager.ts +388 -0
  22. package/packages/core/src/index.ts +30 -0
  23. package/packages/core/src/providers/base.ts +104 -0
  24. package/packages/core/src/providers/sendgrid.ts +368 -0
  25. package/packages/core/src/types/provider.ts +91 -0
  26. package/packages/core/src/types/scheduled.ts +78 -0
  27. package/packages/core/src/types/template.ts +97 -0
  28. package/packages/core/tsconfig.json +23 -0
  29. package/packages/python/README.md +106 -0
  30. package/packages/python/email_template_manager/__init__.py +66 -0
  31. package/packages/python/email_template_manager/config.py +98 -0
  32. package/packages/python/email_template_manager/core/magic_links.py +245 -0
  33. package/packages/python/email_template_manager/core/manager.py +344 -0
  34. package/packages/python/email_template_manager/core/scheduler.py +473 -0
  35. package/packages/python/email_template_manager/exceptions.py +67 -0
  36. package/packages/python/email_template_manager/models/magic_link.py +59 -0
  37. package/packages/python/email_template_manager/models/scheduled.py +78 -0
  38. package/packages/python/email_template_manager/models/template.py +90 -0
  39. package/packages/python/email_template_manager/providers/aws_ses.py +44 -0
  40. package/packages/python/email_template_manager/providers/base.py +94 -0
  41. package/packages/python/email_template_manager/providers/sendgrid.py +325 -0
  42. package/packages/python/email_template_manager/providers/smtp.py +44 -0
  43. package/packages/python/pyproject.toml +133 -0
  44. package/packages/python/setup.py +93 -0
  45. package/packages/python/specification.md +930 -0
  46. package/packages/react/README.md +13 -0
  47. package/packages/react/package.json +105 -0
  48. package/packages/react/rollup.config.js +37 -0
  49. package/packages/react/specification.md +569 -0
  50. package/packages/react/src/index.ts +20 -0
  51. package/packages/react/tsconfig.json +24 -0
  52. package/src/index.js +1 -0
  53. package/test_package.py +125 -0
@@ -0,0 +1,133 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "email-template-manager"
7
+ version = "1.0.0"
8
+ description = "Universal email template management with scheduling and delivery"
9
+ readme = "README.md"
10
+ license = {text = "MIT"}
11
+ authors = [
12
+ {name = "Matt Bernier", email = "matt@example.com"},
13
+ ]
14
+ maintainers = [
15
+ {name = "Matt Bernier", email = "matt@example.com"},
16
+ ]
17
+ classifiers = [
18
+ "Development Status :: 4 - Beta",
19
+ "Intended Audience :: Developers",
20
+ "License :: OSI Approved :: MIT License",
21
+ "Operating System :: OS Independent",
22
+ "Programming Language :: Python :: 3",
23
+ "Programming Language :: Python :: 3.8",
24
+ "Programming Language :: Python :: 3.9",
25
+ "Programming Language :: Python :: 3.10",
26
+ "Programming Language :: Python :: 3.11",
27
+ "Programming Language :: Python :: 3.12",
28
+ "Topic :: Communications :: Email",
29
+ "Topic :: Software Development :: Libraries :: Python Modules",
30
+ ]
31
+ requires-python = ">=3.8"
32
+ dependencies = [
33
+ "pydantic>=2.0.0,<3.0.0",
34
+ "sqlalchemy>=2.0.0,<3.0.0",
35
+ "alembic>=1.12.0,<2.0.0",
36
+ "jinja2>=3.1.0,<4.0.0",
37
+ "httpx>=0.25.0,<1.0.0",
38
+ "cryptography>=41.0.0,<42.0.0",
39
+ "python-dateutil>=2.8.0,<3.0.0",
40
+ "pydantic-settings>=2.0.0,<3.0.0",
41
+ ]
42
+
43
+ [project.optional-dependencies]
44
+ fastapi = [
45
+ "fastapi>=0.104.0,<1.0.0",
46
+ "uvicorn>=0.24.0,<1.0.0",
47
+ ]
48
+ django = [
49
+ "django>=4.2.0,<5.0.0",
50
+ "djangorestframework>=3.14.0,<4.0.0",
51
+ ]
52
+ flask = [
53
+ "flask>=2.3.0,<3.0.0",
54
+ "flask-sqlalchemy>=3.0.0,<4.0.0",
55
+ ]
56
+ sendgrid = [
57
+ "sendgrid>=6.10.0,<7.0.0",
58
+ ]
59
+ aws = [
60
+ "boto3>=1.28.0,<2.0.0",
61
+ ]
62
+ dev = [
63
+ "pytest>=7.4.0,<8.0.0",
64
+ "pytest-asyncio>=0.21.0,<1.0.0",
65
+ "pytest-cov>=4.1.0,<5.0.0",
66
+ "black>=23.7.0,<24.0.0",
67
+ "isort>=5.12.0,<6.0.0",
68
+ "mypy>=1.5.0,<2.0.0",
69
+ "pre-commit>=3.4.0,<4.0.0",
70
+ ]
71
+ all = [
72
+ "fastapi>=0.104.0,<1.0.0",
73
+ "uvicorn>=0.24.0,<1.0.0",
74
+ "django>=4.2.0,<5.0.0",
75
+ "djangorestframework>=3.14.0,<4.0.0",
76
+ "flask>=2.3.0,<3.0.0",
77
+ "flask-sqlalchemy>=3.0.0,<4.0.0",
78
+ "sendgrid>=6.10.0,<7.0.0",
79
+ "boto3>=1.28.0,<2.0.0",
80
+ ]
81
+
82
+ [project.urls]
83
+ Homepage = "https://github.com/mattbernier/email-template-manager"
84
+ Documentation = "https://email-template-manager.readthedocs.io"
85
+ Repository = "https://github.com/mattbernier/email-template-manager"
86
+ "Bug Tracker" = "https://github.com/mattbernier/email-template-manager/issues"
87
+
88
+ [tool.setuptools.packages.find]
89
+ exclude = ["tests", "tests.*"]
90
+
91
+ [tool.black]
92
+ line-length = 88
93
+ target-version = ['py38']
94
+ include = '\.pyi?$'
95
+ extend-exclude = '''
96
+ /(
97
+ # directories
98
+ \.eggs
99
+ | \.git
100
+ | \.hg
101
+ | \.mypy_cache
102
+ | \.tox
103
+ | \.venv
104
+ | build
105
+ | dist
106
+ )/
107
+ '''
108
+
109
+ [tool.isort]
110
+ profile = "black"
111
+ multi_line_output = 3
112
+ line_length = 88
113
+ known_first_party = ["email_template_manager"]
114
+
115
+ [tool.mypy]
116
+ python_version = "3.8"
117
+ warn_return_any = true
118
+ warn_unused_configs = true
119
+ disallow_untyped_defs = true
120
+ disallow_incomplete_defs = true
121
+ check_untyped_defs = true
122
+ disallow_untyped_decorators = true
123
+ no_implicit_optional = true
124
+ warn_redundant_casts = true
125
+ warn_unused_ignores = true
126
+ warn_no_return = true
127
+ warn_unreachable = true
128
+
129
+ [tool.pytest.ini_options]
130
+ minversion = "6.0"
131
+ addopts = "-ra -q --strict-markers --cov=email_template_manager --cov-report=term-missing"
132
+ testpaths = ["tests"]
133
+ pythonpath = ["."]
@@ -0,0 +1,93 @@
1
+ """
2
+ Copyright (c) 2025 Bernier LLC
3
+
4
+ This file is licensed to the client under a limited-use license.
5
+ The client may use and modify this code *only within the scope of the project it was delivered for*.
6
+ Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
7
+ """
8
+
9
+ #!/usr/bin/env python
10
+
11
+ from setuptools import setup, find_packages
12
+
13
+ with open("README.md", "r", encoding="utf-8") as fh:
14
+ long_description = fh.read()
15
+
16
+ # Core dependencies
17
+ install_requires = [
18
+ "pydantic>=2.0.0,<3.0.0",
19
+ "sqlalchemy>=2.0.0,<3.0.0",
20
+ "alembic>=1.12.0,<2.0.0",
21
+ "jinja2>=3.1.0,<4.0.0",
22
+ "httpx>=0.25.0,<1.0.0",
23
+ "cryptography>=41.0.0,<42.0.0",
24
+ "python-dateutil>=2.8.0,<3.0.0",
25
+ "pydantic-settings>=2.0.0,<3.0.0",
26
+ ]
27
+
28
+ # Framework-specific extras
29
+ extras_require = {
30
+ "fastapi": [
31
+ "fastapi>=0.104.0,<1.0.0",
32
+ "uvicorn>=0.24.0,<1.0.0",
33
+ ],
34
+ "django": [
35
+ "django>=4.2.0,<5.0.0",
36
+ "djangorestframework>=3.14.0,<4.0.0",
37
+ ],
38
+ "flask": [
39
+ "flask>=2.3.0,<3.0.0",
40
+ "flask-sqlalchemy>=3.0.0,<4.0.0",
41
+ ],
42
+ "sendgrid": [
43
+ "sendgrid>=6.10.0,<7.0.0",
44
+ ],
45
+ "aws": [
46
+ "boto3>=1.28.0,<2.0.0",
47
+ ],
48
+ "dev": [
49
+ "pytest>=7.4.0,<8.0.0",
50
+ "pytest-asyncio>=0.21.0,<1.0.0",
51
+ "pytest-cov>=4.1.0,<5.0.0",
52
+ "black>=23.7.0,<24.0.0",
53
+ "isort>=5.12.0,<6.0.0",
54
+ "mypy>=1.5.0,<2.0.0",
55
+ "pre-commit>=3.4.0,<4.0.0",
56
+ ],
57
+ }
58
+
59
+ # Add 'all' extra that includes everything
60
+ extras_require["all"] = [
61
+ dep for deps in extras_require.values() for dep in deps
62
+ ]
63
+
64
+ setup(
65
+ name="email-template-manager",
66
+ version="1.0.0",
67
+ author="Matt Bernier",
68
+ author_email="matt@example.com",
69
+ description="Universal email template management with scheduling and delivery",
70
+ long_description=long_description,
71
+ long_description_content_type="text/markdown",
72
+ url="https://github.com/mattbernier/email-template-manager",
73
+ packages=find_packages(exclude=["tests", "tests.*"]),
74
+ classifiers=[
75
+ "Development Status :: 4 - Beta",
76
+ "Intended Audience :: Developers",
77
+ "License :: OSI Approved :: MIT License",
78
+ "Operating System :: OS Independent",
79
+ "Programming Language :: Python :: 3",
80
+ "Programming Language :: Python :: 3.8",
81
+ "Programming Language :: Python :: 3.9",
82
+ "Programming Language :: Python :: 3.10",
83
+ "Programming Language :: Python :: 3.11",
84
+ "Programming Language :: Python :: 3.12",
85
+ "Topic :: Communications :: Email",
86
+ "Topic :: Software Development :: Libraries :: Python Modules",
87
+ ],
88
+ python_requires=">=3.8",
89
+ install_requires=install_requires,
90
+ extras_require=extras_require,
91
+ include_package_data=True,
92
+ zip_safe=False,
93
+ )