Posted by & filed under python.

Вот такие мысли появились.
Сталкнулся с такой проблемой — написание тестов занимает большую часть времени, но не у всех тестов одинаковый приоритет. Есть тесты, которые обрабатываю такие ситуации, вероятность происхождения которых очень низка.
Поэтому возникли мысли, а может стоит ввести понятия родов в тестах:

  • тесты 1 рода, проверяют работоспособность системы когда данные введены все правильно, пользователь не может ввести ошибку, здесь проверяется бизнеч логика
  • тест 2 рода здесь проверяют основные варианты, где пользователь может допустить ошибку (вместе с тестами 1 рода эти тесты должно покрывать 80-90% процентов случаев)
  • тесты 3 рода, проверяют маловероятные варианты событий (делаются в последнюю очередь с целью сэкономить время)

Также к тестам первого рода можно отнести приемочные тесты, а также user stories заказчика.
Возможно оптимальным путем будет вынесение приемочных тестов в отдельное место/приложение

Posted by & filed under django.

Django-nose — приложение упрощающее тестирование в django. Основными фишками является то, что:
— позволяет запускать только твои тесты, и пропускать системные тесты в django
— позволяет выполнять отдельные тесты в отдельных файлах  и причем файл не обязан называться tests.py
— позволяет создать визуальное покрытие тестами кода (создает html файлик, в котором отдельным цветом выделены участки кода покрытые тестами)

Установка:

pip install django-nose

Добавляем ‘django_nose’ в INSTALLED_APPS:

INSTALLED_APPS = (
...
'django_nose',

...
)

Устанавливаем TEST_RUNNER:

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'

Posted by & filed under django.

Задача: создать пустой HttpRequest (или не пустой 🙂 )
Решение:

Найдено на просторах инета:

from django.test import RequestFactory

request_factory = RequestFactory()
request = request_factory.post('/fake-path', data={'name': u'Waldo'})

Оригинал:

http://tech.novapost.fr/django-unit-test-your-views-en.html

Posted by & filed under python.

Божественный и простой способ сравнения словарей:

a={'a': 1, 'b': 2 }
b={'b': 2, 'a': 1 }
print(cmp(a,b))

Posted by & filed under Мысли.

СУПЕР СТАТЬЯ!!!! ВСЁ МОИ МЫСЛИ, КОТОРЫЕ КРУЖИЛИСЬ ПО ПОВОДУ РАЗРАБОТКИ СОБРАЛИСЬ ЗДЕСЬ!

Для себя ещё хотел бы записать следущее правило:
Не допускать инверсии:

например, вместо константы NOT_CHANGE_MAP=True, делать например так:
HOLD_MAP=True

Posted by & filed under python.

Скрипт ежедневного бекапа Mysql (основано на этом)

#!/bin/bash
# Created by Dmitry
# based on solution from http://carrotplant.com/en/blog/how-to-dump-all-mysql-databases-into-separate-files

USER="root"
PASSWORD="root"
OUTPUTDIR="/home/dmitry/Backups/mysql_everyday_backup2/"
GZIP_ENABLED=1

MYSQLDUMP="/usr/bin/mysqldump"
MYSQL="/usr/bin/mysql"

if [ ! -d "$OUTPUTDIR" ]; then
    mkdir -p $OUTPUTDIR
fi
OUTPUTDIR_CURRENT=$OUTPUTDIR/backup_$(date '+%Y-%m-%d_%T')
if [ ! -d "$OUTPUTDIR_CURRENT" ]; then
    mkdir -p $OUTPUTDIR_CURRENT
fi

# get a list of databases
databases=`$MYSQL --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"`

# dump each database in turn
for db in $databases; do
    echo $db
	if [ $GZIP_ENABLED == 1 ]; then
		$MYSQLDUMP --force --opt --user=$USER --password=$PASSWORD --databases $db | gzip > "$OUTPUTDIR_CURRENT/$db.gz"
	else
	    $MYSQLDUMP --force --opt --user=$USER --password=$PASSWORD --databases $db > "$OUTPUTDIR_CURRENT/$db.sql"
   	fi    
done

Теперь только в cron прописываем:

0 0 * * * /home/dmitry/mysqlbackup2

Posted by & filed under python.

Суть heartbeat:
RabbitMQ-cервер периодически отсылает heartbeat сигналы (frames) клиентам и ждет от них ответа.
Если определенное количество сингналов теряется, то соединение закрывается.

Hearbeat обычно используется для проверки, что клиент на другой стороне всё ещё живой, и не упал с незакрытым соединением (ИМХО, полезно если клиент выполняет времяемкие операции и может долго не отвечать)

Posted by & filed under python.

Настройка аутентификации на RabbitMQ сервере:
Добавление пользователя

sudo rabbitmqctl add_user myusername mypassword

Добавление виртуального хоста

sudo rabbitmqctl add_vhost /myvhost

Настройка прав:

sudo rabbitmqctl set_permissions -p /myvhost myusername ".*" ".*" ".*"

UPD:
Назначение админских прав:

sudo rabbitmqctl set_user_tags myusername administrator

Нужно для полноценного просмотра через web-интерфейс (http://localhost:55672/)

Posted by & filed under django.

Определение:

class Aclass(models.Model):
    #some fields here
    pass

    ...
class Bclass(models.Model):
    b_field = models.ForeignKey(Aclass)

Использование:

a=Aclass.objects.get(pk=1)
a.aclass_set.objects.all()

Posted by & filed under python.

Задача:
Переместить git репозиторий существующего проекта в другое место (Практический смысл: перемещение на другой физический носитель, с целью избежать потери данных)

Исходное состояние:
1) проект
2) .git директория (расположена рядом)

Решение:
1) перемещаем .git директорию в другое место
2) создаем файл .git со следующим содержанием:

gitdir: /home/dmitry/another_path/.git

Всё.
Проверяем: git status
Всё корректно работает.