Exemple #1
0
def loaddata(args, options):
    filepath, = args

    deserialize = optional_import('django.core.serializers').deserialize
    with open(filepath, 'r') as handle:
        models_by_class = collections.defaultdict(list)
        related_models = list()

        for model in deserialize('json', handle):
            model_class = model.object.__class__
            models_by_class[model_class].append(model.object)

            for field, values in model.m2m_data.items():
                if values:
                    related_models.append((model.object, field, values))

    from django.db import transaction
    waiting_room = WaitingRoom()

    with transaction.atomic():
        for model_class, models_list in models_by_class.items():
            dependencies = Dependencies.from_model(model_class)
            debug('Needs %s for %s', dependencies, model_class.__name__)

            if model_class in dependencies:
                debug('Circual dependencies for %s, proceed with caution', model_class)

            proceed = Proceed(model_class, models_list)
            waiting_room.enter(dependencies, proceed)

        waiting_room.empty()

        if options.force:
            for proceed, deps in list(waiting_room):
                for dep in deps:
                    def noop():
                        debug('== Force resolve for %s ==', proceed)
                        return dep
                    waiting_room.enter(Dependencies.none(), noop)

        if waiting_room:
            raise RuntimeError('Still some people in the waiting room:\n{}'.format(
                waiting_room))

        for model, field, values in related_models:
            debug('Adding %s to %s(%s)', values, model, field)
            getattr(model, field).add(*values)
Exemple #2
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-


import sys
import os


from paver.easy import task, call_task, path, no_help, needs, debug, info
from paver.setuputils import setup, _get_distribution

from sett import ROOT, optional_import

version = optional_import('packaging.version')


@task
@no_help
def setup_options(options):
    try:
        from setup import build_info
    except ImportError:
        sys.path.append(ROOT)
        from setup import build_info
    setup(**build_info)


@task
def clean():
    """Clean the workspace"""
    path('dist').rmtree()
Exemple #3
0
from __future__ import absolute_import

import sys
import os
import re
import itertools
import subprocess
import collections

from paver.easy import (task, consume_nargs, consume_args, might_call,
                        call_task, sh, no_help, info, needs, debug, path)
from paver.deps.six import text_type

from sett import which, DeployContext, defaults, task_alternative, optional_import

django_module = optional_import('django')


@task
def clean_migrations(env):
    """
    Merge uncommitted migrations
    """
    migration_re = re.compile('^\d{4}_[a-z0-9_]+\.py$')
    git_status = subprocess.Popen([
        which.git, 'ls-files', '--others', '--exclude-standard',
    ],
        stdout=subprocess.PIPE,
    )
    encoding = sys.getfilesystemencoding()
    matches = collections.defaultdict(list)
Exemple #4
0
# -*- coding: utf-8 -*-

import sys
from xml.etree import ElementTree as ET

from paver.easy import task, info, path, debug
from paver.deps.six import text_type

from sett import which, ROOT, defaults, optional_import
from sett.daemon import Daemon, daemon_task
from sett.paths import LOGS
from sett.pip import VENV_DIR
from sett.deploy_context import DeployContext


yaml = optional_import('yaml')

UWSGI_PATH = ROOT.joinpath('var')

CONFIG_ROOT = ROOT.joinpath('parts/uwsgi/')


@DeployContext.register_default
def uwsgi_context():
    return {
        'uwsgi': {
            'config': get_uwsgi_output().config_path,
        },
        'ctl': '{} daemon'.format(path(sys.argv[0]).abspath()),
    }
Exemple #5
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import time
import json
import optparse

from paver.easy import task, cmdopts, consume_nargs
from sett import defaults, __version__ as sett_version, optional_import

requests = optional_import('requests')


@task
@cmdopts([
    optparse.make_option(
        '--remote',
        default='',
    ),
    optparse.make_option(
        '-m',
        '--method',
        default='POST',
    ),
    optparse.make_option(
        '-s',
        '--stream',
        action='store_true',
        default=False,
    ),
Exemple #6
0
# -*- coding: utf-8 -*-

import os

from sett import optional_import
from paver.easy import task, consume_nargs, info

docker_compose = optional_import('compose.cli.command', 'docker-compose')


class DockerCompose(object):
    """
    A docker compose context manager.

    It can start a set of containers described by a docker-compose.yml, stop
    and remove them after.

    >>> with DockerCompose() as infra:
    ...     infra.ip('db')
        172.16.0.2
    """
    def __init__(self, basedir='.', name=None, keep=False, filename='docker-compose.yml'):
        self.project = docker_compose.get_project(
            base_dir=basedir,
            config_path=[filename],
            project_name=name,
        )
        self.keep = keep

    def __repr__(self):
        return '<{} {}>'.format(self.__class__.__name__, self.project.name)
Exemple #7
0
# -*- coding: utf-8 -*-

import time
import os.path
import collections
import importlib
import traceback
import threading

from sett import optional_import, defaults, ROOT
from sett.utils.dispatch import Dispatcher
from paver.easy import task, info, debug, consume_args, path, error
from paver.deps.six import string_types, moves

observers = optional_import('watchdog.observers')
events = optional_import('watchdog.events')
libsass = optional_import('sass', 'libsass')


# Time to wait for additional events in seconds
DEBOUNCE_WAIT = 0.250


class SassDispatcher(Dispatcher):
    def __init__(self):
        self._sass = Sass.default()

    @Dispatcher.auto
    @Dispatcher.on('watch', -1)
    def compile(self):
        """Launches the compilation of all sass files"""