Opened 4 years ago

Closed 4 years ago

#24857 closed New feature (fixed)

Add __main__ entry point as an alias for django-admin

Reported by: Tomáš Ehrlich Owned by: Tim Graham <timograham@…>
Component: Core (Management commands) Version: master
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: yes
Needs tests: yes Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

There's a original pull request at https://github.com/django/django/pull/4588

Add __main__ entry point, so we can call management command via python -m django. It will behave as an alias for django-admin (django-admin.py).

Change History (8)

comment:1 Changed 4 years ago by Tomáš Ehrlich

Needs documentation: set
Needs tests: set
Owner: changed from nobody to Tomáš Ehrlich
Status: newassigned

comment:2 Changed 4 years ago by Baptiste Mispelon

Triage Stage: UnreviewedAccepted

I think this is a good idea and there was support for it on the mailing list thread [1].

The PR looks good but some basic tests would be nice.

[1] https://groups.google.com/forum/#!searchin/django-developers/guessable/django-developers/_Mrf1nFVchk/tfpGyKatiHIJ

comment:3 Changed 4 years ago by Tomáš Ehrlich

I've started working on it. I want to make django/bin/django-admin.py an alias for django/__main__.py so we don't have to duplicate code (just two lines though) but the best what I've got so far is:

# django/bin/django-admin.py
#!/usr/bin/env python
from runpy import run_module

if __name__ == "__main__":
    run_module('django')

Not sure if it's worth it. I'll rather write some tests…

comment:4 Changed 4 years ago by Ryan Hiebert

I don't think it's worth it. I expect others will too, given that's how the duplication is avoided in manage.py.

comment:5 Changed 4 years ago by Ryan Hiebert

I've worked on this a bit more, added a couple updates to the PR referenced in the OP. I spent a little time figuring out how to test it, but don't have it all worked out yet. Best I can tell so far is that the tests probably need to live in tests/admin_scripts/tests.py, but I don't have it worked out what and how is the best way to test.

My first thought is to subclass or copy the DjangoAdmin* tests to use the python entry point. I could subclass AdminScriptTestCase, but that just seems like a lot of test coupling.

One problem I'm not quite sure how to deal with is that the current tests don't seem to require that Django be installed properly. I might be able to just make sure the current working directory is the root of the repository...

comment:6 Changed 4 years ago by Tim Graham

Did you investigate my suggestion of using the subprocess module (following the example in tests/model_regress/test_pickle.py). I don't think we need to test python -m django, but rather just execute the the __main__.py script directly and ensure it works like django-admin (one test should be enough -- I don't think we don't need to execute all the admin_script tests through it).

comment:7 Changed 4 years ago by Tomáš Ehrlich

Owner: Tomáš Ehrlich deleted
Status: assignednew

I agree that simple test will be sufficient:

import subprocess


def test_module_installed():
    call_args = ['python', '-m', 'django', '-v']
    assert subprocess.call(call_args) == 0

comment:8 Changed 4 years ago by Tim Graham <timograham@…>

Owner: set to Tim Graham <timograham@…>
Resolution: fixed
Status: newclosed

In 617eff4:

Fixed #24857 -- Added "python -m django" entry point.

Note: See TracTickets for help on using tickets.
Back to Top