
Zart
18.08.2016
13:35:05
ему там скорее опа выдадут...

Cykooz
18.08.2016
13:41:58
Если что, то я запилил в джанге поддержку вот такой херни внутри urls .py:
def urlpatterns():
return [
url(...),
url(...),
]
Т.е. теперь можно перед запуском любого теста сбросить кеш всех url-роутов, и джанга пройдясь по urls.py выполнит функцию urlpatterns() заново. Таким образом я могу в тестах динамически включать-выключать разные роуты, которые управляются настройками.

Sergey
18.08.2016
13:43:59
зачем их динамически включать в тестах?

Andrey
18.08.2016
13:44:10
Кстати, люди. Как тестировать то, что работает с сетью?

Google

Cykooz
18.08.2016
13:45:39
@fix_ut У меня есть в приложении типа плагинов, которые включаются/выключатся настройками. И некоторые из них выключены по умолчанию. А в тестах мне надо их как то тестировать. В обычной ситуации это попа-боль, т.к. джанга один раз пройдясь по urls.py больше не имеет возможности хоть как то изменить список роутов (т.к. по сути они хранятся в глобальной переменной)

Zart
18.08.2016
13:46:01
почему?

Sergey
18.08.2016
13:46:21

Viktor
18.08.2016
13:46:23
А с каких пор global эквивалентно const?
Я конечно не знаю что у вас там в этой джанге
но звучит тупо

Zart
18.08.2016
13:47:16
у джанги в начале реквеста идёт резолюшен - и урлконф можно отдавать динамически на лету
а вот то, что отдаваться должно имя ЁБАНОГО МОДУЛЯ - авторам апи осиновый кол в анус

Cykooz
18.08.2016
13:47:45
Ну потому что если ты один раз выполнил при импорте что то такое
urlpatters = [...]
if settings.MY_PLUGIN:
urlpatterns += [...]
То уже ничего не сможешь в тестах изменить внутри urlpatters.

Pavel
18.08.2016
13:49:16
ROOT_URLCONF¶
Default: Not defined
A string representing the full Python import path to your root URLconf. For example: "mydjangoapps.urls". Can be overridden on a per-request basis by setting the attribute urlconf on the incoming HttpRequest object. See How Django processes a request for details.

Cykooz
18.08.2016
13:49:22
И вот я точно не хочу в каждом тесте разбираться какой такой urlconf мне надо динамически отдавать. Я просто хочу поменять настройку settings.MY_PLUGIN где то в setUp() и что бы всё заработало

Zart
18.08.2016
13:50:20
ну так и в зависимости от списка плагинов и генерить урлконф
но апи дебилен по самые гланды
я кстати делал такую же фигню, но пересоздавал всги апп с мидлварями, кэшируя по ключу из включенных модулей

Google

Cykooz
18.08.2016
13:52:54
ну так и в зависимости от списка плагинов и генерить урлконф
Генерить? Я не такой ушибленый ? У меня в проекте 20+ приложений и с десяток плагинов ещё. Я уколебусь что то там генерить на каждый случай. И потом ещё контролировать, что бы то что я сгенерил совпадало с тем что у меня в urls.py (т.е. после любого изменения в urls.py плагина, мне надо в тестах поправить что то).
В джанге ещё используется кеширование этих роутов внутри threadlocal переменной
Вот так сбрасываются эти кеши
get_resolver.cache_clear()
get_ns_resolver.cache_clear()

Pavel
18.08.2016
13:54:28

Zart
18.08.2016
13:55:01
матчинг идёт тупым перебором регэкспов в урлконфе 8\

Pavel
18.08.2016
13:55:09

Cykooz
18.08.2016
13:55:47

Zart
18.08.2016
13:56:00
да
но они предоставляют возможность выбора импорта на каждом реквесте

Pavel
18.08.2016
13:56:20
How Django processes a request¶
...
Django loads that Python module and looks for the variable urlpatterns. This should be a Python list of django.conf.urls.url() instances.

Zart
18.08.2016
13:56:21
это чтобы можно было роутить к приложениям
джанго слишком рьяно любит глобальные переменные
и это полный пиздец

Cykooz
18.08.2016
13:57:14
Вот я и сделал, что теперь urlpatterns может быть функцией, а не списком


Zart
18.08.2016
13:57:19
но нубам этого не объяснишь 8(
самодостаточный жангоапп:
def demosite_django(global_conf={}, **settings):
import types
try:
from django.core.wsgi import get_wsgi_application as WSGIHandler
except ImportError: # pragma: no cover
from django.core.handlers.wsgi import WSGIHandler
# required settings
settings.setdefault('SECRET_KEY', 'secret')
settings.setdefault('ALLOWED_HOSTS', ['*'])
# set DEBUG for debug mode
if 'debug' in settings:
settings['DEBUG'] = asbool(settings.pop('debug'))
# hack to provide django with dedicated module for settings and urlconf
name = os.environ['DJANGO_SETTINGS_MODULE'] = str('__settings_' + __name__)
mod = sys.modules[name] = types.ModuleType(name)
vars(mod).update(settings)
mod.__file__ = __file__ # django somehow depends on this
mod.ROOT_URLCONF = name
mod.urlpatterns = []
mod.handler404 = 'django.http.HttpResponseNotFound' # disable templates
app = WSGIHandler()
return app


Cykooz
18.08.2016
14:04:09
Но теперь у меня вторая попа боль появилась.
Велика была когда то моя радость, что в джангу наконец что добавили возможность сконфигурировать приложение перед тем как джанга начнёт обрабатывать запросы, т.е. можно было запилить вот такой классик
class UsersConfig(AppConfig):
name = 'project.users'
def ready(self):
from . import handlers # registrate signals handlers
from .tasks import remove_user # registrate celery tasks
# some other actions
Но как оказалось - эта самая ready() вызывается в тестах тоже только один раз (наверное при первой инициализации приложения). Подозреваю что где то в джанге есть очередной threadlocal кеш приложений, который надо зачистить, что бы можно было заставить джангу вызывать этот ready() в начале каждого теста.

Zart
18.08.2016
14:06:51
скучаешь по @subscribe(IApplicationCreated), да?

Cykooz
18.08.2016
14:08:22
Ага, как раз и хотел в этом ready() регистрировать разнные утилитки в реестре компонентов ?
А то сейчас приходится в стиле джанго делать глобальную переменную с инстанцем утилитки, которая инициализируется при импорте

Google

53r63rn4r
18.08.2016
15:14:14
/stat

Combot
18.08.2016
15:14:15
combot.org/chat/-1001051329193

Pavel
18.08.2016
15:42:08

[Anonymous]
18.08.2016
15:52:27

Zart
18.08.2016
17:22:44
гм, на степике типичная олимпиадная задачка на спираль, оказывается

Johnnie
18.08.2016
17:23:32
какая?

Zart
18.08.2016
17:24:05
по числу N вывести матрицу NxN заполненную по спирали от 1 до N*N

Johnnie
18.08.2016
17:24:41
а, дык была же уже тут)

Andrey
18.08.2016
17:25:45

Zart
18.08.2016
17:26:02
я сделал while и 4 цикла внутри
нахера рекурсия?

Andrey
18.08.2016
17:27:24
нахера рекурсия?
Логичнее смотрится по-моему. Делаешь n/2 витков. Эти витки одинаковы. Вот и рекурсия. Можно, конечно, циклом, но лень думать как его сделать.

Zart
18.08.2016
17:27:45
я мыслил в рамочках
начинаем с 0,0 и идём по диагонали - 1,1, потом 2, 2 и т.д.
с этой стартовой точки рисуем циклами рамки NxN, а потом режем N на два

Denis
18.08.2016
18:03:57
Кто сможет сделать спираль через генераторы?

Zart
18.08.2016
18:04:43
я заюзал из итертулсов

Lyubov
18.08.2016
19:04:42
Всем привет! Меня зовут Люба, я работаю в редакции #tceh. Пишу сейчас материал для тех, кто только собирается стать кодером. Про негласные правила внутри сообществ программистов: как не делать то, что всех раздражает, но о чём нигде не написано. И какие трудности возникают на первых этапах при вступлении в сообщество.
Можете подкинуть идей, пожалуйста? В чат или в личку. Заранее спасибо)

Alexander
18.08.2016
19:06:06
откуда те, кто собирается стать кодером, должны знать негласные правила внутри сообществ программистов и что всех раздражает?

Zart
18.08.2016
19:06:23
*достал попкорн*

⬗VLAD⌶K⬖
18.08.2016
19:06:56
вероятно раздражают те вопросы на которые может ответить гугл

Google

Zart
18.08.2016
19:07:25
раздражают вопросы ради вопросов "а можно спросить?"

dmks
18.08.2016
19:07:59

Zart
18.08.2016
19:08:00
осталось выяснить кому же адресован вопрос - новичкам или не очень 8)))

⬗VLAD⌶K⬖
18.08.2016
19:08:57
скорее всего мне подобным=)

[Anonymous]
18.08.2016
19:09:30
такой*

Gra4
18.08.2016
19:10:20
Сейчас мы узнаем, как не злить Зарта.
А-то он уже сбегал в Руд)

Admin
ERROR: S client not available

Zart
18.08.2016
19:10:57
да вы тут молчите второй день

Lyubov
18.08.2016
19:11:01

Gra4
18.08.2016
19:11:28

[Anonymous]
18.08.2016
19:12:10

Lyubov
18.08.2016
19:12:19

dmks
18.08.2016
19:12:57
именно из-за устаревания информации

Zart
18.08.2016
19:13:37
and now from the top. one, two...

⬗VLAD⌶K⬖
18.08.2016
19:14:27
это слишком вводящие в тему кодерства вопросы, скорее всего их не поймут далекие от программирования люди

Lyubov
18.08.2016
19:15:42

tosh
18.08.2016
19:15:48
Смешно, что если разобраться, то сложно придумать негласные правила

Google

tosh
18.08.2016
19:15:57
Есть раздражающие моменты, но у каждого они свои

Gra4
18.08.2016
19:15:58

Pavel
18.08.2016
19:16:00
ПОдскажите, какую книгу прочитать про питон?

Zart
18.08.2016
19:16:23
бляяя

Pavel
18.08.2016
19:16:26

tosh
18.08.2016
19:16:30
На самом деле тут палка о двух концах

Lyubov
18.08.2016
19:16:37

Zart
18.08.2016
19:16:41
паша угодил точно в мозоль

[Anonymous]
18.08.2016
19:16:48
Ну, ладно, если тебя такие вопросы интересуют)

tosh
18.08.2016
19:17:22
Если чувак не спросит, то потом придет и станет рассказывать ахинею и аргументировать ее тем что "а в гугле/стековерфлоу так писали и им норм"

⬗VLAD⌶K⬖
18.08.2016
19:17:28
не изучив базовый синтаксис языка ( модификаторы вывода) человек возопил о помощи, человек отказался читать вводную к задаче

Lyubov
18.08.2016
19:18:09
а где искать актуальную инфу по теме, чтобы не задавать бородатых вопросов?

tosh
18.08.2016
19:18:11
Бесят студенты, которые неизвестно зачем пошли учиться и просят решить задачку под предлогом ачотевпадлуштоль

[Anonymous]
18.08.2016
19:18:39
Зачем, блин, чат этот? Вам не лень было делать его, называть его "че то о питоне и уже"?

Zart
18.08.2016
19:18:42
http://www.catb.org/esr/faqs/smart-questions.html бессмертное

tosh
18.08.2016
19:18:46

dmks
18.08.2016
19:19:08

tosh
18.08.2016
19:19:16
Да, они оттуда же
Но вот про читать

Gra4
18.08.2016
19:19:39
Вопросы 'для телепатов' или 'а как ...' тоже раздражают, наверное
Эта группа больше не существует