- Template name:
telegram.message
- Content:
{{- /* Telegram message to use: {{ template "telegram.message2" . }} */ -}} {{ define "__alerts_list" -}} {{ range . }} {{if ne (index .Labels "alertname") "" -}} {{ if eq .Status "firing" }}🔴{{ else }}🟢{{ end }} {{- if ne (index .Labels "severity") "" -}} <u><b>P{{ index .Labels "severity" }}</b></u> {{ end -}}
Сегодня попался рельсовый код, в котором используются монады, сервисы и прочее. Решил сделать обзор с объяснением того, что в коде не нравится и что можно исправить.
Данный разбор основан только на личном опыте и избегает попытку написать самый идеальный код на свете. К сожалению пошарить ссылку на код не могу, потому что автор попросил опубликовать анонимно.
Главная операция, которая вызывается из контроллера выглядит следующим образом:
require_relative './container' | |
module Dry | |
module AutoInject | |
class Strategies | |
class Kwargs | |
def included(klass) | |
included_items | |
super | |
end |
Slides: https://speakerdeck.com/davydovanton/hanami-architecture
Telegram channel (russian): https://t.me/pepegramming
Ссылки на конкретные посты: http://telegra.ph/Pepegramming-Contents-07-16
Опять рассмотрим tasks#create
экшен.
В экшене 3 разных логики, которые выполняются последовательно:
- валидация данных - необходимый шаг;
- сохраниение таска - необходимый шаг, если какая-то ошибка, необходимо возвращать failed значение;
- отправка нотификаций - мы не хотим, что бы наша транзакия не выполнялась, если отправка нотификации не выполнится;
Поэтому напишем нашу транзакцию. Так же мы будем использовать Either монаду для возвращения статуса шага транзакции. Right
для успешного, Left
- не успешного:
require 'benchmark' | |
first = 'first' | |
second = 'second' | |
n = 1_000_000 | |
Benchmark.bm do |x| | |
x.report('string interpolation: '){ n.times { "#{first}_#{second}" } } | |
x.report('string interpolation #2: '){ n.times { first + '_' + second } } | |
x.report('string interpolation #3: '){ n.times { "%s_%s" % [first, second] } } | |
x.report('join array: '){ n.times { [first, second].join('_') } } |
Пример из pepegramming канала
Есть экшен в рельсе, который создает инвойс:
def create
invoice = Invoice.new(params[:invoice])
if invoice.save
Давай представим ситуацию, когда тебе, в зависимости от какой-то логики нужно вернуть данные разного типа, например есть такая функция:
def function(foo, bar)
result = if foo > bar
10
else
"wrong"
end
end
require 'dry/monads' | |
require 'dry/monads/right_biased' | |
require 'dry/monads/result' | |
require 'dry/monads/maybe' | |
module Dry | |
module Monads | |
module RightBiased | |
module Right | |
def deconstruct |
Hello! | |
Some information about hanami workshop. | |
Requirements: | |
* ruby 2.5+ (and bundler) | |
* postgresql (9.6.2+) | |
Before start workshop please install hanami gem to your system |