Docs.

portnov [2009-07-12 15:25:29]
Docs.
Filename
Blog/Settings.hs
Framework/Signals.hs
README.ru
TODO
diff --git a/Blog/Settings.hs b/Blog/Settings.hs
index d2035c9..94a3149 100644
--- a/Blog/Settings.hs
+++ b/Blog/Settings.hs
@@ -12,15 +12,19 @@ import Framework.Forms.Types

 import Invalidation

+-- | Handle request exception. Should end with returnNow. If it is just @return ()@, built-in handler will work.
 requestExcHandler :: ExcHandler
 requestExcHandler rq code msg = do
     returnNow $ renderToResponse (show code++".html") [("error", C msg),
                                                        ("request", C $ show rq),
                                                        ("url", C $ uriPath $ rqURI rq)]

+-- | Handle controller exception. See notes for requestExcHandler.
 controllerExcHandler :: ExcHandler
 controllerExcHandler rq code msg = return ()

+-- | These functions may modify each Form.
+formProcessors :: [Form -> Form]
 formProcessors = [simple]

 simple :: Form -> Form
diff --git a/Framework/Signals.hs b/Framework/Signals.hs
index baaf9c5..205dbcd 100644
--- a/Framework/Signals.hs
+++ b/Framework/Signals.hs
@@ -18,7 +18,10 @@ signals = defaultSignals `M.union` connectSignals

 defaultSignals = M.fromList []

-send :: Signal -> Model -> AController ()
+-- | Send a signal.
+send :: Signal          -- ^ Signal name
+     -> Model           -- ^ Parameter for signal
+     -> AController ()
 send sig model =
     case M.lookup sig signals of
       Nothing -> return ()
diff --git a/README.ru b/README.ru
index 65f092f..7671742 100644
--- a/README.ru
+++ b/README.ru
@@ -111,3 +111,24 @@ controller = do
     rq <- asks request        -- Получить объект-запрос
     doSomethingWith rq
     ...
+
+## Сигналы
+
+Фреймворк включает модуль Signals, который работает в общих чертах аналогично сигналам в Django. Главное отличие -- сигналы и их обработчики регистрируются не во время исполнения, а статически.
+
+## Исключения
+
+Также фреймворк включает систему "исключений". Различаются два типа исключений: возникающие в контроллере (Controller exception) и возникающие на стадии обработки запроса (Request exception). Вторые порождает сам фреймворк -- например, когда не может найти подходящего контроллера для обработки URL. В контроллере можно породить исключение функцией raiseC с двумя параметрами -- код ошибки (соответствует HTTP status code) и собственно сообщение об ошибке.
+
+По умолчанию работают простые встроенные обработчики исключений, но приложение может определить собственные (см. ниже).
+
+## Расширяемость
+
+Фреймворк является "точечно расширяемым". Это означает, что расширение функциональности фреймворка предусмотрено в некотором ограниченном количестве мест. Сейчас этими местами являются:
+
+ * Генерация форм: приложение может определить функции, через которые будет проходить каждая форма (Form). Например, можно добавлять дополнительные поля итп.
+ * Request Middlewares: это функции StaticConfig -> HttpRequest -> IO HttpRequest, через которые проходит каждый запрос прежде чем попасть в диспетчер URL.
+ * Response Middlewares: это функции StaticConfig -> HttpResponse -> IO HttpResponse, через которые проходит ответ прежде чем он будет отдан веб-сервером.
+ * Обработчики исключений: приложение может определить свои обработчики для request exceptions и controller exceptions.
+
+Все эти функции должны быть определены в приложении в модуле Settings.hs, оттуда их импортируют разные части фреймворка. В нём же определяется соответствие возможных сигналов и их обработчиков.
diff --git a/TODO b/TODO
index 4182cc7..7fa7d90 100644
--- a/TODO
+++ b/TODO
@@ -2,9 +2,9 @@ TODO

  * Человеческая обработка завершения программы;
  * Соответственно, все параметры, которые сейчас hard-coded, брать из конфига;
- * Более высокоуровневый интерфейс для кэша - чтоб было легко закэшировать результат всей функции;
- * Соответственно, простые средства для инвалидации кэша;
- * Более продвинутые и высокоуровневые функции генерации SQL;
+ * [PARTIALLY DONE] Более высокоуровневый интерфейс для кэша - чтоб было легко закэшировать результат всей функции;
+ * [PARTIALLY DONE] Соответственно, простые средства для инвалидации кэша;
+ * [PARTIALLY DONE] Более продвинутые и высокоуровневые функции генерации SQL;
  * (?) Слой абстракции от диалекта SQL;
  * (?) Генерация структуры Form по Model (с возможностью переопределить, или просто не использовать);
  * (?) Автоматические CRUD-контроллеры;
ViewGit