davedash / django-fixture-magic

Utilities to extract and manipulate Django Fixtures.
BSD 3-Clause "New" or "Revised" License
389 stars 95 forks source link

merge_fixtures should write to stdout #72

Open florianm opened 5 years ago

florianm commented 5 years ago

Just a consistency issue: dump_objects writes to stdout, while merge_fixtures doesn't.

I want to use the commands from functions, so capturing stdout is easy:

    with open("my_app/fixtures/test_fixture.json", 'w+') as f:
        call_command('dump_object', 'my_app.MyModel *list_of_some_pks, '-k', '-n', stdout=f)
        f.readlines()

Whereas trying to merge fixtures the same way fails (or I fail to capture the output):

with open("my_app/fixtures/test_fixtures_combined.json", 'w+') as f:
        call_command(
            "merge_fixtures",
            "my_app/fixtures/test_fixture_1.json",
            "my_app/fixtures/test_fixture_2.json",
            stdout=f
        )
        f.readlines()

Is this intended behaviour?

florianm commented 5 years ago

Update: how to run merge_fixtures from inside a function using Python 3.4+

from contextlib import redirect_stdout

f = io.StringIO()
    with redirect_stdout(f):
        call_command(
            "merge_fixtures",
            "my_app/fixtures/test_fixture_1.json",
            "my_app/fixtures/test_fixture_2.json",
            "my_app/fixtures/test_fixture_3.json",
            "my_app/fixtures/test_fixture_4.json"
        )
        with open("my_app/fixtures/test_fixtures_combined.json", 'w+') as ff:
            ff.write(f.getvalue())

Credit: stackoverflow answer by ForeverWintr

The above workaround does the job for me. Suggestions:

Otherwise, thanks for this package, it's perfect solution to quickly carve out some test data from a larger db.

dopry commented 1 year ago

This would be a good feature. Both should probably write to stdout and have a --output options.