locksafe 0.3.2__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.
- locksafe-0.3.2/.github/workflows/publish-to-pip.yml +71 -0
- locksafe-0.3.2/.github/workflows/release.yml +49 -0
- locksafe-0.3.2/.gitignore +205 -0
- locksafe-0.3.2/.locksafe.toml +5 -0
- locksafe-0.3.2/.pre-commit-config.yaml +7 -0
- locksafe-0.3.2/PKG-INFO +137 -0
- locksafe-0.3.2/README.md +97 -0
- locksafe-0.3.2/docs/Acquisition/Affiliate-Marketing/README.md +9 -0
- locksafe-0.3.2/docs/Acquisition/Cold-Email/README.md +48 -0
- locksafe-0.3.2/docs/Acquisition/Content-Marketing/README.md +40 -0
- locksafe-0.3.2/docs/Acquisition/Influencer-Outreach/README.md +9 -0
- locksafe-0.3.2/docs/Acquisition/SEO-Wins/README.md +45 -0
- locksafe-0.3.2/docs/Acquisition/Social-Media/README.md +9 -0
- locksafe-0.3.2/docs/Analytics/AB-Testing/README.md +9 -0
- locksafe-0.3.2/docs/Analytics/Cohort-Analysis/README.md +9 -0
- locksafe-0.3.2/docs/Analytics/Funnel-Analysis/README.md +9 -0
- locksafe-0.3.2/docs/Analytics/KPI-Dashboard/README.md +59 -0
- locksafe-0.3.2/docs/Analytics/User-Tracking/README.md +9 -0
- locksafe-0.3.2/docs/Conversion/Checkout-Optimization/README.md +9 -0
- locksafe-0.3.2/docs/Conversion/Free-Trial/README.md +9 -0
- locksafe-0.3.2/docs/Conversion/Freemium-Model/README.md +51 -0
- locksafe-0.3.2/docs/Conversion/Pricing-Strategy/README.md +65 -0
- locksafe-0.3.2/docs/Conversion/Sales-Funnel/README.md +9 -0
- locksafe-0.3.2/docs/Design/Design-System/README.md +43 -0
- locksafe-0.3.2/docs/Design/Prototype/README.md +31 -0
- locksafe-0.3.2/docs/Design/UI-Design/README.md +29 -0
- locksafe-0.3.2/docs/Design/UX-Flows/README.md +49 -0
- locksafe-0.3.2/docs/Design/Wireframes/README.md +30 -0
- locksafe-0.3.2/docs/Distribution/Communities/README.md +36 -0
- locksafe-0.3.2/docs/Distribution/Directories/README.md +9 -0
- locksafe-0.3.2/docs/Distribution/Integrations/README.md +9 -0
- locksafe-0.3.2/docs/Distribution/Partnerships/README.md +9 -0
- locksafe-0.3.2/docs/Distribution/SaaS-Marketplaces/README.md +9 -0
- locksafe-0.3.2/docs/Growth/Community-Building/README.md +9 -0
- locksafe-0.3.2/docs/Growth/Expansion-Strategy/README.md +9 -0
- locksafe-0.3.2/docs/Growth/Product-Led-Growth/README.md +59 -0
- locksafe-0.3.2/docs/Growth/Referral-Programs/README.md +9 -0
- locksafe-0.3.2/docs/Growth/Viral-Loops/README.md +9 -0
- locksafe-0.3.2/docs/Idea/Competitor-Analysis/README.md +55 -0
- locksafe-0.3.2/docs/Idea/Market-Research/README.md +57 -0
- locksafe-0.3.2/docs/Idea/Niche-Selection/README.md +51 -0
- locksafe-0.3.2/docs/Idea/Opportunity-Mapping/README.md +50 -0
- locksafe-0.3.2/docs/Idea/Problem-Discovery/README.md +59 -0
- locksafe-0.3.2/docs/Launch/Beta-Users/README.md +9 -0
- locksafe-0.3.2/docs/Launch/Early-Adopters/README.md +47 -0
- locksafe-0.3.2/docs/Launch/Landing-Page/README.md +9 -0
- locksafe-0.3.2/docs/Launch/Product-Hunt/README.md +48 -0
- locksafe-0.3.2/docs/Launch/Public-Release/README.md +9 -0
- locksafe-0.3.2/docs/Planning/Development-Plan/README.md +51 -0
- locksafe-0.3.2/docs/Planning/Feature-Prioritization/README.md +40 -0
- locksafe-0.3.2/docs/Planning/MVP-Scope/README.md +63 -0
- locksafe-0.3.2/docs/Planning/Product-Roadmap/README.md +54 -0
- locksafe-0.3.2/docs/Planning/Tech-Stack/README.md +58 -0
- locksafe-0.3.2/docs/Retention/Churn-Reduction/README.md +47 -0
- locksafe-0.3.2/docs/Retention/Customer-Support/README.md +9 -0
- locksafe-0.3.2/docs/Retention/Email-Automation/README.md +9 -0
- locksafe-0.3.2/docs/Retention/Feature-Adoption/README.md +9 -0
- locksafe-0.3.2/docs/Retention/User-Onboarding/README.md +52 -0
- locksafe-0.3.2/docs/Revenue/Add-ons/README.md +9 -0
- locksafe-0.3.2/docs/Revenue/Annual-Plans/README.md +9 -0
- locksafe-0.3.2/docs/Revenue/Enterprise-Deals/README.md +9 -0
- locksafe-0.3.2/docs/Revenue/Subscriptions/README.md +53 -0
- locksafe-0.3.2/docs/Revenue/Upsells/README.md +9 -0
- locksafe-0.3.2/docs/Scaling/Automation/README.md +9 -0
- locksafe-0.3.2/docs/Scaling/Exit-Strategy/README.md +42 -0
- locksafe-0.3.2/docs/Scaling/Global-Expansion/README.md +9 -0
- locksafe-0.3.2/docs/Scaling/Hiring/README.md +9 -0
- locksafe-0.3.2/docs/Scaling/Systems/README.md +9 -0
- locksafe-0.3.2/docs/Validation/Customer-Interviews/README.md +68 -0
- locksafe-0.3.2/docs/Validation/Demand-Testing/README.md +38 -0
- locksafe-0.3.2/docs/Validation/Landing-Page-Test/README.md +55 -0
- locksafe-0.3.2/docs/Validation/Pre-Sales/README.md +48 -0
- locksafe-0.3.2/docs/Validation/Waitlist/README.md +41 -0
- locksafe-0.3.2/locksafe/__init__.py +1 -0
- locksafe-0.3.2/locksafe/api/__init__.py +0 -0
- locksafe-0.3.2/locksafe/api/routers/__init__.py +0 -0
- locksafe-0.3.2/locksafe/cli/__init__.py +0 -0
- locksafe-0.3.2/locksafe/cli/commands/__init__.py +0 -0
- locksafe-0.3.2/locksafe/cli/commands/analyze.py +47 -0
- locksafe-0.3.2/locksafe/cli/commands/version.py +9 -0
- locksafe-0.3.2/locksafe/cli/main.py +26 -0
- locksafe-0.3.2/locksafe/cli/ui/__init__.py +0 -0
- locksafe-0.3.2/locksafe/cli/ui/console.py +3 -0
- locksafe-0.3.2/locksafe/cli/ui/renderer.py +59 -0
- locksafe-0.3.2/locksafe/cli/ui/theme.py +7 -0
- locksafe-0.3.2/locksafe/core/__init__.py +0 -0
- locksafe-0.3.2/locksafe/core/analyzer/__init__.py +0 -0
- locksafe-0.3.2/locksafe/core/analyzer/migration_analyzer.py +30 -0
- locksafe-0.3.2/locksafe/core/config.py +21 -0
- locksafe-0.3.2/locksafe/core/engine.py +39 -0
- locksafe-0.3.2/locksafe/core/parser/__init__.py +0 -0
- locksafe-0.3.2/locksafe/core/parser/parse_sql.py +32 -0
- locksafe-0.3.2/locksafe/core/rules/__init__.py +0 -0
- locksafe-0.3.2/locksafe/core/rules/add_column_rules.py +80 -0
- locksafe-0.3.2/locksafe/core/rules/alter_table_rule.py +31 -0
- locksafe-0.3.2/locksafe/core/rules/alter_type_rules.py +22 -0
- locksafe-0.3.2/locksafe/core/rules/base_rule.py +14 -0
- locksafe-0.3.2/locksafe/core/rules/drop_rules.py +36 -0
- locksafe-0.3.2/locksafe/core/rules/engine_rules.py +35 -0
- locksafe-0.3.2/locksafe/core/rules/fk_rules.py +44 -0
- locksafe-0.3.2/locksafe/core/rules/index_rules.py +55 -0
- locksafe-0.3.2/locksafe/core/rules/lock_rules.py +18 -0
- locksafe-0.3.2/locksafe/core/rules/rename_rules.py +48 -0
- locksafe-0.3.2/locksafe/core/rules/rule_registry.py +49 -0
- locksafe-0.3.2/locksafe/core/rules/truncate_rules.py +28 -0
- locksafe-0.3.2/locksafe/utils/logger.py +78 -0
- locksafe-0.3.2/pyproject.toml +86 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
publish:
|
|
13
|
+
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
|
|
18
|
+
- name: Checkout repository
|
|
19
|
+
uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- name: Set up Python
|
|
22
|
+
uses: actions/setup-python@v5
|
|
23
|
+
with:
|
|
24
|
+
python-version: "3.12"
|
|
25
|
+
|
|
26
|
+
- name: Install dependencies
|
|
27
|
+
run: |
|
|
28
|
+
python -m pip install --upgrade pip
|
|
29
|
+
pip install build twine
|
|
30
|
+
|
|
31
|
+
- name: Read version from pyproject.toml
|
|
32
|
+
id: version
|
|
33
|
+
run: |
|
|
34
|
+
python - <<EOF
|
|
35
|
+
import tomllib
|
|
36
|
+
with open("pyproject.toml","rb") as f:
|
|
37
|
+
data = tomllib.load(f)
|
|
38
|
+
version = data["project"]["version"]
|
|
39
|
+
print("VERSION="+version)
|
|
40
|
+
with open("$GITHUB_ENV","a") as f:
|
|
41
|
+
f.write("VERSION="+version+"\n")
|
|
42
|
+
EOF
|
|
43
|
+
|
|
44
|
+
- name: Check if tag already exists
|
|
45
|
+
id: tagcheck
|
|
46
|
+
run: |
|
|
47
|
+
if git rev-parse "v${VERSION}" >/dev/null 2>&1; then
|
|
48
|
+
echo "Tag already exists"
|
|
49
|
+
echo "exists=true" >> $GITHUB_OUTPUT
|
|
50
|
+
else
|
|
51
|
+
echo "exists=false" >> $GITHUB_OUTPUT
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
- name: Create git tag
|
|
55
|
+
if: steps.tagcheck.outputs.exists == 'false'
|
|
56
|
+
run: |
|
|
57
|
+
git config user.name "github-actions"
|
|
58
|
+
git config user.email "actions@github.com"
|
|
59
|
+
git tag v${VERSION}
|
|
60
|
+
git push origin v${VERSION}
|
|
61
|
+
|
|
62
|
+
- name: Build package
|
|
63
|
+
run: |
|
|
64
|
+
python -m build
|
|
65
|
+
|
|
66
|
+
- name: Publish to PyPI
|
|
67
|
+
run: |
|
|
68
|
+
twine upload dist/*
|
|
69
|
+
env:
|
|
70
|
+
TWINE_USERNAME: __token__
|
|
71
|
+
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
pull_request:
|
|
8
|
+
branches:
|
|
9
|
+
- main
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: write
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
build-and-release:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- name: Checkout repository
|
|
20
|
+
uses: actions/checkout@v4
|
|
21
|
+
|
|
22
|
+
- name: Setup Python
|
|
23
|
+
uses: actions/setup-python@v5
|
|
24
|
+
with:
|
|
25
|
+
python-version: "3.12"
|
|
26
|
+
|
|
27
|
+
- name: Install build tools
|
|
28
|
+
run: |
|
|
29
|
+
python -m pip install --upgrade pip
|
|
30
|
+
pip install build
|
|
31
|
+
|
|
32
|
+
- name: Build package
|
|
33
|
+
run: python -m build
|
|
34
|
+
|
|
35
|
+
- name: Extract version
|
|
36
|
+
if: github.event_name == 'push'
|
|
37
|
+
id: version
|
|
38
|
+
run: |
|
|
39
|
+
VERSION=$(grep '^version' pyproject.toml | head -1 | cut -d '"' -f2)
|
|
40
|
+
echo "version=v$VERSION" >> $GITHUB_OUTPUT
|
|
41
|
+
|
|
42
|
+
- name: Create GitHub Release
|
|
43
|
+
if: github.event_name == 'push'
|
|
44
|
+
uses: softprops/action-gh-release@v2
|
|
45
|
+
with:
|
|
46
|
+
tag_name: ${{ steps.version.outputs.version }}
|
|
47
|
+
files: dist/*
|
|
48
|
+
env:
|
|
49
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py.cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
.pybuilder/
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
88
|
+
# .python-version
|
|
89
|
+
|
|
90
|
+
# pipenv
|
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
94
|
+
# install all needed dependencies.
|
|
95
|
+
# Pipfile.lock
|
|
96
|
+
|
|
97
|
+
# UV
|
|
98
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
99
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
100
|
+
# commonly ignored for libraries.
|
|
101
|
+
# uv.lock
|
|
102
|
+
|
|
103
|
+
# poetry
|
|
104
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
105
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
106
|
+
# commonly ignored for libraries.
|
|
107
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
108
|
+
# poetry.lock
|
|
109
|
+
# poetry.toml
|
|
110
|
+
|
|
111
|
+
# pdm
|
|
112
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
113
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
114
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
115
|
+
# pdm.lock
|
|
116
|
+
# pdm.toml
|
|
117
|
+
.pdm-python
|
|
118
|
+
.pdm-build/
|
|
119
|
+
|
|
120
|
+
# pixi
|
|
121
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
122
|
+
# pixi.lock
|
|
123
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
124
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
125
|
+
.pixi
|
|
126
|
+
|
|
127
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
128
|
+
__pypackages__/
|
|
129
|
+
|
|
130
|
+
# Celery stuff
|
|
131
|
+
celerybeat-schedule
|
|
132
|
+
celerybeat.pid
|
|
133
|
+
|
|
134
|
+
# Redis
|
|
135
|
+
*.rdb
|
|
136
|
+
*.aof
|
|
137
|
+
*.pid
|
|
138
|
+
|
|
139
|
+
# RabbitMQ
|
|
140
|
+
mnesia/
|
|
141
|
+
rabbitmq/
|
|
142
|
+
rabbitmq-data/
|
|
143
|
+
|
|
144
|
+
# ActiveMQ
|
|
145
|
+
activemq-data/
|
|
146
|
+
|
|
147
|
+
# SageMath parsed files
|
|
148
|
+
*.sage.py
|
|
149
|
+
|
|
150
|
+
# Environments
|
|
151
|
+
.env
|
|
152
|
+
.envrc
|
|
153
|
+
.venv
|
|
154
|
+
env/
|
|
155
|
+
venv/
|
|
156
|
+
myenv/
|
|
157
|
+
ENV/
|
|
158
|
+
env.bak/
|
|
159
|
+
venv.bak/
|
|
160
|
+
|
|
161
|
+
# Spyder project settings
|
|
162
|
+
.spyderproject
|
|
163
|
+
.spyproject
|
|
164
|
+
|
|
165
|
+
# Rope project settings
|
|
166
|
+
.ropeproject
|
|
167
|
+
|
|
168
|
+
# mkdocs documentation
|
|
169
|
+
/site
|
|
170
|
+
|
|
171
|
+
# mypy
|
|
172
|
+
.mypy_cache/
|
|
173
|
+
.dmypy.json
|
|
174
|
+
dmypy.json
|
|
175
|
+
|
|
176
|
+
# Pyre type checker
|
|
177
|
+
.pyre/
|
|
178
|
+
|
|
179
|
+
# pytype static type analyzer
|
|
180
|
+
.pytype/
|
|
181
|
+
|
|
182
|
+
# Cython debug symbols
|
|
183
|
+
cython_debug/
|
|
184
|
+
|
|
185
|
+
# Visual Studio Code
|
|
186
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
187
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
188
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
189
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
190
|
+
.vscode/
|
|
191
|
+
|
|
192
|
+
# Ruff stuff:
|
|
193
|
+
.ruff_cache/
|
|
194
|
+
|
|
195
|
+
# PyPI configuration file
|
|
196
|
+
.pypirc
|
|
197
|
+
|
|
198
|
+
# Marimo
|
|
199
|
+
marimo/_static/
|
|
200
|
+
marimo/_lsp/
|
|
201
|
+
__marimo__/
|
|
202
|
+
|
|
203
|
+
# Streamlit
|
|
204
|
+
.streamlit/secrets.toml
|
|
205
|
+
test-migrations/
|
locksafe-0.3.2/PKG-INFO
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: locksafe
|
|
3
|
+
Version: 0.3.2
|
|
4
|
+
Summary: Postgres migration safety analyzer — catch dangerous operations before they run
|
|
5
|
+
Project-URL: Homepage, https://locksafe.dev
|
|
6
|
+
Project-URL: Repository, https://github.com/yourusername/locksafe
|
|
7
|
+
Project-URL: Issues, https://github.com/yourusername/locksafe/issues
|
|
8
|
+
License: MIT
|
|
9
|
+
Keywords: ci-cd,database,migrations,postgres,safety
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Topic :: Database
|
|
15
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
16
|
+
Requires-Python: >=3.12
|
|
17
|
+
Requires-Dist: click>=8.1.0
|
|
18
|
+
Requires-Dist: rich>=13.0.0
|
|
19
|
+
Requires-Dist: sqlglot[c]>=25.0.0
|
|
20
|
+
Requires-Dist: tomli>=2.0.0; python_version < '3.11'
|
|
21
|
+
Requires-Dist: typing-extensions>=4.12.0
|
|
22
|
+
Provides-Extra: api
|
|
23
|
+
Requires-Dist: asyncpg>=0.29.0; extra == 'api'
|
|
24
|
+
Requires-Dist: boto3>=1.35.0; extra == 'api'
|
|
25
|
+
Requires-Dist: fastapi>=0.115.0; extra == 'api'
|
|
26
|
+
Requires-Dist: pydantic>=2.0.0; extra == 'api'
|
|
27
|
+
Requires-Dist: python-multipart>=0.0.9; extra == 'api'
|
|
28
|
+
Requires-Dist: razorpay>=1.4.0; extra == 'api'
|
|
29
|
+
Requires-Dist: sentry-sdk[fastapi]>=2.0.0; extra == 'api'
|
|
30
|
+
Requires-Dist: uvicorn[standard]>=0.30.0; extra == 'api'
|
|
31
|
+
Provides-Extra: dev
|
|
32
|
+
Requires-Dist: httpx>=0.27.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: mypy>=1.11.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: pre-commit>=3.7.0; extra == 'dev'
|
|
35
|
+
Requires-Dist: pytest-asyncio>=0.24.0; extra == 'dev'
|
|
36
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
|
|
37
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
38
|
+
Requires-Dist: ruff>=0.7.0; extra == 'dev'
|
|
39
|
+
Description-Content-Type: text/markdown
|
|
40
|
+
|
|
41
|
+
# 🔒 LockSafe
|
|
42
|
+
|
|
43
|
+
> **Stop production downtime caused by unsafe Postgres migrations — before they ever run.**
|
|
44
|
+
|
|
45
|
+
LockSafe analyzes Postgres migration files, detects dangerous operations, estimates lock duration, and rewrites migrations using safe patterns — integrated directly into CI/CD.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## The Product
|
|
50
|
+
|
|
51
|
+
| | |
|
|
52
|
+
|---|---|
|
|
53
|
+
| **Problem** | Alembic, Flyway, Liquibase run migrations with zero safety awareness |
|
|
54
|
+
| **Solution** | Pre-run static analyzer + CI/CD integration + safe rewrite engine |
|
|
55
|
+
| **Free tier** | `pip install locksafe` — local CLI, forever free, no account needed |
|
|
56
|
+
| **Team plan** | ₹1,499/mo — GitHub Action, PR comments, lock estimator, dashboard |
|
|
57
|
+
| **Business plan** | ₹4,999/mo — safe rewrite engine, Slack alerts, audit log |
|
|
58
|
+
| **MRR target** | ₹50,000 by Month 3 · ₹2,00,000 by Month 9 |
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Build Timeline
|
|
63
|
+
|
|
64
|
+
| Phase | Dates | Status |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| Project setup + CLI scaffold | Mar 14 – Mar 28 | 🟡 In progress |
|
|
67
|
+
| SQL parser + risk rule engine | Mar 28 – Apr 18 | ⬜ Upcoming |
|
|
68
|
+
| Safe rewrite engine | Apr 18 – May 9 | ⬜ Upcoming |
|
|
69
|
+
| GitHub Actions integration | May 9 – May 23 | ⬜ Upcoming |
|
|
70
|
+
| Payments + landing page | May 23 – May 30 | ⬜ Upcoming |
|
|
71
|
+
| Beta testing + bug fixes | May 30 – Jun 12 | ⬜ Upcoming |
|
|
72
|
+
| **Public launch** | **Jun 12, 2026** | ⬜ Upcoming |
|
|
73
|
+
| First revenue target | Jun 26, 2026 | ⬜ Upcoming |
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Repo Structure
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
.
|
|
81
|
+
├── README.md
|
|
82
|
+
│
|
|
83
|
+
├── docs/ # Business, strategy, and product decisions
|
|
84
|
+
│ ├── Idea/ # Problem discovery, market research, competition
|
|
85
|
+
│ ├── Validation/ # Customer interviews, waitlist, pre-sales
|
|
86
|
+
│ ├── Planning/ # Roadmap, MVP scope, tech stack, dev plan
|
|
87
|
+
│ ├── Design/ # Wireframes, UX flows, design system
|
|
88
|
+
│ ├── Launch/ # Landing page, Product Hunt, early adopters
|
|
89
|
+
│ ├── Acquisition/ # SEO, content, social, cold email
|
|
90
|
+
│ ├── Distribution/ # Directories, communities, partnerships
|
|
91
|
+
│ ├── Conversion/ # Funnel, pricing, freemium, checkout
|
|
92
|
+
│ ├── Revenue/ # Subscriptions, upsells, enterprise
|
|
93
|
+
│ ├── Analytics/ # Tracking, funnels, KPIs, A/B tests
|
|
94
|
+
│ ├── Retention/ # Onboarding, email automation, churn
|
|
95
|
+
│ ├── Growth/ # Referrals, PLG, viral loops
|
|
96
|
+
│ └── Scaling/ # Automation, hiring, exit
|
|
97
|
+
│
|
|
98
|
+
└── tech/ # Engineering decisions and implementation docs
|
|
99
|
+
├── Development/ # Backend, frontend, APIs, database, auth
|
|
100
|
+
├── Infrastructure/ # Cloud hosting, DevOps, CI/CD, monitoring
|
|
101
|
+
└── Testing/ # Unit, integration, performance, beta
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Tech Stack
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
CLI → Python + Click pip install locksafe
|
|
110
|
+
SQL Parser → sqlglot Postgres AST, no regex
|
|
111
|
+
Backend API → FastAPI + asyncpg Async, raw SQL, no ORM
|
|
112
|
+
Database → PostgreSQL RDS on AWS
|
|
113
|
+
File Storage → AWS S3 Report archives
|
|
114
|
+
Payments → Razorpay Subscriptions + webhooks
|
|
115
|
+
Deployment → Docker Compose → EC2 (MVP) → EKS + Terraform (post-revenue)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Quick Links
|
|
121
|
+
|
|
122
|
+
| | |
|
|
123
|
+
|---|---|
|
|
124
|
+
| Product & feature spec | [docs/Planning/MVP-Scope](docs/Planning/MVP-Scope/README.md) |
|
|
125
|
+
| Full roadmap | [docs/Planning/Product-Roadmap](docs/Planning/Product-Roadmap/README.md) |
|
|
126
|
+
| Tech stack decisions | [docs/Planning/Tech-Stack](docs/Planning/Tech-Stack/README.md) |
|
|
127
|
+
| Development plan | [docs/Planning/Development-Plan](docs/Planning/Development-Plan/README.md) |
|
|
128
|
+
| Pricing strategy | [docs/Conversion/Pricing-Strategy](docs/Conversion/Pricing-Strategy/README.md) |
|
|
129
|
+
| Backend architecture | [tech/Development/Backend](tech/Development/Backend/README.md) |
|
|
130
|
+
| Database schema | [tech/Development/Database](tech/Development/Database/README.md) |
|
|
131
|
+
| CI/CD setup | [tech/Infrastructure/CI-CD](tech/Infrastructure/CI-CD/README.md) |
|
|
132
|
+
| Competitor analysis | [docs/Idea/Competitor-Analysis](docs/Idea/Competitor-Analysis/README.md) |
|
|
133
|
+
| KPI dashboard | [docs/Analytics/KPI-Dashboard](docs/Analytics/KPI-Dashboard/README.md) |
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
*Solo build · Part-time · 10–20 hrs/week · Started March 14, 2026*
|
locksafe-0.3.2/README.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# 🔒 LockSafe
|
|
2
|
+
|
|
3
|
+
> **Stop production downtime caused by unsafe Postgres migrations — before they ever run.**
|
|
4
|
+
|
|
5
|
+
LockSafe analyzes Postgres migration files, detects dangerous operations, estimates lock duration, and rewrites migrations using safe patterns — integrated directly into CI/CD.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## The Product
|
|
10
|
+
|
|
11
|
+
| | |
|
|
12
|
+
|---|---|
|
|
13
|
+
| **Problem** | Alembic, Flyway, Liquibase run migrations with zero safety awareness |
|
|
14
|
+
| **Solution** | Pre-run static analyzer + CI/CD integration + safe rewrite engine |
|
|
15
|
+
| **Free tier** | `pip install locksafe` — local CLI, forever free, no account needed |
|
|
16
|
+
| **Team plan** | ₹1,499/mo — GitHub Action, PR comments, lock estimator, dashboard |
|
|
17
|
+
| **Business plan** | ₹4,999/mo — safe rewrite engine, Slack alerts, audit log |
|
|
18
|
+
| **MRR target** | ₹50,000 by Month 3 · ₹2,00,000 by Month 9 |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Build Timeline
|
|
23
|
+
|
|
24
|
+
| Phase | Dates | Status |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| Project setup + CLI scaffold | Mar 14 – Mar 28 | 🟡 In progress |
|
|
27
|
+
| SQL parser + risk rule engine | Mar 28 – Apr 18 | ⬜ Upcoming |
|
|
28
|
+
| Safe rewrite engine | Apr 18 – May 9 | ⬜ Upcoming |
|
|
29
|
+
| GitHub Actions integration | May 9 – May 23 | ⬜ Upcoming |
|
|
30
|
+
| Payments + landing page | May 23 – May 30 | ⬜ Upcoming |
|
|
31
|
+
| Beta testing + bug fixes | May 30 – Jun 12 | ⬜ Upcoming |
|
|
32
|
+
| **Public launch** | **Jun 12, 2026** | ⬜ Upcoming |
|
|
33
|
+
| First revenue target | Jun 26, 2026 | ⬜ Upcoming |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Repo Structure
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
.
|
|
41
|
+
├── README.md
|
|
42
|
+
│
|
|
43
|
+
├── docs/ # Business, strategy, and product decisions
|
|
44
|
+
│ ├── Idea/ # Problem discovery, market research, competition
|
|
45
|
+
│ ├── Validation/ # Customer interviews, waitlist, pre-sales
|
|
46
|
+
│ ├── Planning/ # Roadmap, MVP scope, tech stack, dev plan
|
|
47
|
+
│ ├── Design/ # Wireframes, UX flows, design system
|
|
48
|
+
│ ├── Launch/ # Landing page, Product Hunt, early adopters
|
|
49
|
+
│ ├── Acquisition/ # SEO, content, social, cold email
|
|
50
|
+
│ ├── Distribution/ # Directories, communities, partnerships
|
|
51
|
+
│ ├── Conversion/ # Funnel, pricing, freemium, checkout
|
|
52
|
+
│ ├── Revenue/ # Subscriptions, upsells, enterprise
|
|
53
|
+
│ ├── Analytics/ # Tracking, funnels, KPIs, A/B tests
|
|
54
|
+
│ ├── Retention/ # Onboarding, email automation, churn
|
|
55
|
+
│ ├── Growth/ # Referrals, PLG, viral loops
|
|
56
|
+
│ └── Scaling/ # Automation, hiring, exit
|
|
57
|
+
│
|
|
58
|
+
└── tech/ # Engineering decisions and implementation docs
|
|
59
|
+
├── Development/ # Backend, frontend, APIs, database, auth
|
|
60
|
+
├── Infrastructure/ # Cloud hosting, DevOps, CI/CD, monitoring
|
|
61
|
+
└── Testing/ # Unit, integration, performance, beta
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Tech Stack
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
CLI → Python + Click pip install locksafe
|
|
70
|
+
SQL Parser → sqlglot Postgres AST, no regex
|
|
71
|
+
Backend API → FastAPI + asyncpg Async, raw SQL, no ORM
|
|
72
|
+
Database → PostgreSQL RDS on AWS
|
|
73
|
+
File Storage → AWS S3 Report archives
|
|
74
|
+
Payments → Razorpay Subscriptions + webhooks
|
|
75
|
+
Deployment → Docker Compose → EC2 (MVP) → EKS + Terraform (post-revenue)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Quick Links
|
|
81
|
+
|
|
82
|
+
| | |
|
|
83
|
+
|---|---|
|
|
84
|
+
| Product & feature spec | [docs/Planning/MVP-Scope](docs/Planning/MVP-Scope/README.md) |
|
|
85
|
+
| Full roadmap | [docs/Planning/Product-Roadmap](docs/Planning/Product-Roadmap/README.md) |
|
|
86
|
+
| Tech stack decisions | [docs/Planning/Tech-Stack](docs/Planning/Tech-Stack/README.md) |
|
|
87
|
+
| Development plan | [docs/Planning/Development-Plan](docs/Planning/Development-Plan/README.md) |
|
|
88
|
+
| Pricing strategy | [docs/Conversion/Pricing-Strategy](docs/Conversion/Pricing-Strategy/README.md) |
|
|
89
|
+
| Backend architecture | [tech/Development/Backend](tech/Development/Backend/README.md) |
|
|
90
|
+
| Database schema | [tech/Development/Database](tech/Development/Database/README.md) |
|
|
91
|
+
| CI/CD setup | [tech/Infrastructure/CI-CD](tech/Infrastructure/CI-CD/README.md) |
|
|
92
|
+
| Competitor analysis | [docs/Idea/Competitor-Analysis](docs/Idea/Competitor-Analysis/README.md) |
|
|
93
|
+
| KPI dashboard | [docs/Analytics/KPI-Dashboard](docs/Analytics/KPI-Dashboard/README.md) |
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
*Solo build · Part-time · 10–20 hrs/week · Started March 14, 2026*
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Cold Email
|
|
2
|
+
|
|
3
|
+
## Target: Engineering leads and platform engineers at Postgres-using startups
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## List Building
|
|
8
|
+
|
|
9
|
+
- LinkedIn search: "platform engineer" + "backend" at Series A/B Indian startups
|
|
10
|
+
- GitHub: contributors to Alembic, Flask-Migrate, Django-migrations
|
|
11
|
+
- AngelList / YC company list filtered by tech stack
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Email Template
|
|
16
|
+
|
|
17
|
+
**Subject:** "Quick question about your Postgres migration workflow"
|
|
18
|
+
|
|
19
|
+
**Body:**
|
|
20
|
+
Hi [Name],
|
|
21
|
+
|
|
22
|
+
I'm building LockSafe — a CLI tool that analyzes Postgres migrations before they run and flags dangerous operations (non-concurrent indexes, table rewrites, etc.).
|
|
23
|
+
|
|
24
|
+
Has your team ever had a migration cause unexpected downtime in production?
|
|
25
|
+
|
|
26
|
+
If yes, I'd love 15 minutes to understand your workflow and see if LockSafe could help. No pitch — just genuinely trying to understand the problem.
|
|
27
|
+
|
|
28
|
+
If you're curious: `pip install locksafe && locksafe check <any migration file>` takes 10 seconds.
|
|
29
|
+
|
|
30
|
+
[Your name]
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Personalization Notes
|
|
35
|
+
|
|
36
|
+
- Reference a specific technology they use (Alembic, SQLAlchemy)
|
|
37
|
+
- Mention any open-source work they've done
|
|
38
|
+
- If they've written about database ops publicly, reference that post
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Metrics
|
|
43
|
+
|
|
44
|
+
Target: 50 emails/week, 20% reply rate, 5% book a call.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
*Last updated: March 2026*
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Content Marketing
|
|
2
|
+
|
|
3
|
+
## Strategy
|
|
4
|
+
|
|
5
|
+
Educate developers about migration safety. Position LockSafe as the resource they find when they search for this topic.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Content Types
|
|
10
|
+
|
|
11
|
+
### Blog posts (high effort, high ROI)
|
|
12
|
+
- Deep technical posts on migration dangers
|
|
13
|
+
- "We analyzed 10,000 Alembic migration files — here's what we found"
|
|
14
|
+
- Post-mortems of migration-caused incidents (with permission or fictionalized)
|
|
15
|
+
|
|
16
|
+
### Twitter/X threads (low effort, fast distribution)
|
|
17
|
+
- "7 Postgres operations that can take down production (thread 🧵)"
|
|
18
|
+
- "The right way to add a NOT NULL column without downtime"
|
|
19
|
+
- Reply to threads about production incidents with helpful context
|
|
20
|
+
|
|
21
|
+
### README / docs (permanent, compounds)
|
|
22
|
+
- The CLI's README is a content asset
|
|
23
|
+
- Clear, detailed rule explanations in `locksafe explain`
|
|
24
|
+
- Docs site with migration safety guide
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Content Calendar (Post-Launch)
|
|
29
|
+
|
|
30
|
+
| Month | Post |
|
|
31
|
+
|---|---|
|
|
32
|
+
| Jun | "Why we built LockSafe" — founder story post |
|
|
33
|
+
| Jul | "CREATE INDEX CONCURRENTLY: complete guide" |
|
|
34
|
+
| Aug | "Postgres lock types every backend engineer should know" |
|
|
35
|
+
| Sep | "How to add NOT NULL columns to large Postgres tables" |
|
|
36
|
+
| Oct | "Migration horror stories: a collection" |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
*Last updated: March 2026*
|