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 Мысли.

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

Http iframes are not shown in https pages in many major browsers. Please read this post for details.

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

например, вместо константы 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
Всё корректно работает.