Skip to content

Commit 30534ab

Browse files
Extracts common script code.
As a side effect it removes a bug in pa_create_webapp_with_virtualenv.py that would fail on eu.pythonanywhere.com site.
1 parent 0df14c0 commit 30534ab

9 files changed

+52
-61
lines changed

pythonanywhere/utils.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import getpass
2+
import os
3+
4+
5+
def ensure_domain(domain):
6+
if domain == "your-username.pythonanywhere.com":
7+
username = getpass.getuser().lower()
8+
pa_domain = os.environ.get("PYTHONANYWHERE_DOMAIN", "pythonanywhere.com")
9+
return "{username}.{pa_domain}".format(username=username, pa_domain=pa_domain)
10+
else:
11+
return domain

pythonanywhere/utils.pyi

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
def ensure_domain(domain: str) -> str: ...

scripts/pa_autoconfigure_django.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,14 @@
1717
"""
1818

1919
from docopt import docopt
20-
import getpass
21-
import os
2220

2321
from pythonanywhere.django_project import DjangoProject
2422
from pythonanywhere.snakesay import snakesay
23+
from pythonanywhere.utils import ensure_domain
2524

2625

2726
def main(repo_url, domain, python_version, nuke):
28-
if domain == 'your-username.pythonanywhere.com':
29-
username = getpass.getuser().lower()
30-
pa_domain = os.environ.get('PYTHONANYWHERE_DOMAIN', 'pythonanywhere.com')
31-
domain = '{username}.{pa_domain}'.format(username=username, pa_domain=pa_domain)
32-
27+
domain = ensure_domain(domain)
3328
project = DjangoProject(domain, python_version)
3429
project.sanity_checks(nuke=nuke)
3530
project.download_repo(repo_url, nuke=nuke),

scripts/pa_create_webapp_with_virtualenv.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,11 @@
2121

2222
from pythonanywhere.project import Project
2323
from pythonanywhere.snakesay import snakesay
24+
from pythonanywhere.utils import ensure_domain
2425

2526

2627
def main(domain, python_version, nuke):
27-
if domain == 'your-username.pythonanywhere.com':
28-
username = getpass.getuser().lower()
29-
domain = '{username}.pythonanywhere.com'.format(username=username)
30-
28+
domain = ensure_domain(domain)
3129
project = Project(domain, python_version)
3230
project.sanity_checks(nuke=nuke)
3331
project.virtualenv.create(nuke=nuke)
@@ -42,7 +40,7 @@ def main(domain, python_version, nuke):
4240
- Your web app config screen is here: https://www.pythonanywhere.com/user/{username}/webapps/{mangled_domain}
4341
'''.format(
4442
domain=domain,
45-
username=username,
43+
username=getpass.getuser().lower(),
4644
mangled_domain=domain.replace('.', '_')
4745
)
4846
)))

scripts/pa_delete_webapp_logs.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,11 @@
1919

2020
from pythonanywhere.api import Webapp
2121
from pythonanywhere.snakesay import snakesay
22+
from pythonanywhere.utils import ensure_domain
2223

2324

2425
def main(domain, log_type, log_index):
25-
if domain == 'your-username.pythonanywhere.com':
26-
username = getpass.getuser().lower()
27-
pa_domain = os.environ.get('PYTHONANYWHERE_DOMAIN', 'pythonanywhere.com')
28-
domain = '{username}.{pa_domain}'.format(username=username, pa_domain=pa_domain)
29-
30-
webapp = Webapp(domain)
26+
webapp = Webapp(ensure_domain(domain))
3127
log_types = ["access", "error", "server"]
3228
logs = webapp.get_log_info()
3329
if log_type == "all" and log_index == "all":

scripts/pa_start_django_webapp_with_virtualenv.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,14 @@
1313
"""
1414

1515
from docopt import docopt
16-
import getpass
17-
import os
1816

1917
from pythonanywhere.snakesay import snakesay
2018
from pythonanywhere.django_project import DjangoProject
19+
from pythonanywhere.utils import ensure_domain
2120

2221

2322
def main(domain, django_version, python_version, nuke):
24-
if domain == 'your-username.pythonanywhere.com':
25-
username = getpass.getuser().lower()
26-
pa_domain = os.environ.get('PYTHONANYWHERE_DOMAIN', 'pythonanywhere.com')
27-
domain = '{username}.{pa_domain}'.format(username=username, pa_domain=pa_domain)
28-
23+
domain = ensure_domain(domain)
2924
project = DjangoProject(domain, python_version)
3025
project.sanity_checks(nuke=nuke)
3126
project.create_virtualenv(django_version, nuke=nuke)
@@ -43,7 +38,6 @@ def main(domain, django_version, python_version, nuke):
4338
print(snakesay('All done! Your site is now live at https://{domain}'.format(domain=domain)))
4439

4540

46-
4741
if __name__ == '__main__':
4842
arguments = docopt(__doc__)
4943
main(arguments['--domain'], arguments['--django'], arguments['--python'], nuke=arguments.get('--nuke'))

tests/test_pa_autoconfigure_django.py

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -31,27 +31,6 @@ def test_calls_all_stuff_in_right_order(self):
3131
call.start_bash(),
3232
]
3333

34-
35-
def test_domain_defaults_to_using_current_username_and_domain_from_env(self, monkeypatch):
36-
username = getpass.getuser()
37-
monkeypatch.setenv('PYTHONANYWHERE_DOMAIN', 'pythonanywhere.domain')
38-
with patch('scripts.pa_autoconfigure_django.DjangoProject') as mock_DjangoProject:
39-
main('a-repo', 'your-username.pythonanywhere.com', 'python.version', nuke=False)
40-
assert mock_DjangoProject.call_args == call(
41-
username + '.pythonanywhere.domain', 'python.version'
42-
)
43-
44-
45-
def test_lowercases_username(self):
46-
with patch('scripts.pa_autoconfigure_django.getpass') as mock_getpass:
47-
mock_getpass.getuser.return_value = 'UserName1'
48-
with patch('scripts.pa_autoconfigure_django.DjangoProject') as mock_DjangoProject:
49-
main('a-url', 'your-username.pythonanywhere.com', 'python.version', 'nukey')
50-
assert mock_DjangoProject.call_args == call(
51-
'username1.pythonanywhere.com', 'python.version'
52-
)
53-
54-
5534
@pytest.mark.slowtest
5635
def test_actually_works_against_example_repo(
5736
self, fake_home, virtualenvs_folder, api_token, process_killer

tests/test_pa_start_django_webapp_with_virtualenv.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,6 @@ def test_calls_all_stuff_in_right_order(self):
2626
call.webapp.reload(),
2727
]
2828

29-
def test_domain_defaults_to_using_current_username_and_domain_from_env(self, monkeypatch):
30-
username = getpass.getuser()
31-
monkeypatch.setenv("PYTHONANYWHERE_DOMAIN", "pythonanywhere.domain")
32-
with patch("scripts.pa_start_django_webapp_with_virtualenv.DjangoProject") as mock_DjangoProject:
33-
main("your-username.pythonanywhere.com", "django.version", "python.version", nuke=False)
34-
assert mock_DjangoProject.call_args == call(username + ".pythonanywhere.domain", "python.version")
35-
36-
def test_lowercases_username(self):
37-
with patch("scripts.pa_start_django_webapp_with_virtualenv.getpass") as mock_getpass:
38-
mock_getpass.getuser.return_value = "UserName1"
39-
with patch("scripts.pa_start_django_webapp_with_virtualenv.DjangoProject") as mock_DjangoProject:
40-
main("your-username.pythonanywhere.com", "django.version", "python.version", "nukey")
41-
assert mock_DjangoProject.call_args == call("username1.pythonanywhere.com", "python.version")
42-
4329
@pytest.mark.slowtest
4430
def test_actually_creates_django_project_in_virtualenv_with_hacked_settings_and_static_files(
4531
self, fake_home, virtualenvs_folder, api_token

tests/test_utils.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import getpass
2+
from unittest.mock import patch
3+
4+
from pythonanywhere.utils import ensure_domain
5+
6+
7+
class TestEnsureDomain:
8+
def test_domain_defaults_to_using_current_username_and_domain_from_env(
9+
self, monkeypatch
10+
):
11+
username = getpass.getuser()
12+
monkeypatch.setenv("PYTHONANYWHERE_DOMAIN", "pythonanywhere.domain")
13+
14+
result = ensure_domain("your-username.pythonanywhere.com")
15+
16+
assert result == "{}.pythonanywhere.domain".format(username)
17+
18+
def test_lowercases_username(self, monkeypatch):
19+
with patch('pythonanywhere.utils.getpass') as mock_getpass:
20+
mock_getpass.getuser.return_value = 'UserName1'
21+
22+
result = ensure_domain("your-username.pythonanywhere.com")
23+
24+
assert result == 'username1.pythonanywhere.com'
25+
26+
def test_custom_domain_remains_unchanged(self):
27+
custom_domain = "foo.bar.baz"
28+
29+
result = ensure_domain(custom_domain)
30+
31+
assert result == custom_domain

0 commit comments

Comments
 (0)