Skip to content

Instantly share code, notes, and snippets.

@kopylovvlad
Last active September 17, 2017 13:17
Show Gist options
  • Save kopylovvlad/0a3c874cd0b1d42ad32fc311fc3ff2b0 to your computer and use it in GitHub Desktop.
Save kopylovvlad/0a3c874cd0b1d42ad32fc311fc3ff2b0 to your computer and use it in GitHub Desktop.
require 'json'
module JSONable
def to_json(*options)
as_json(*options).to_json(*options)
end
end
class Tag
attr_reader :title
include JSONable
def initialize(title)
@title = title
end
def as_json(options={})
{ title: title }
end
end
class Article
attr_accessor :title, :description, :tags
include JSONable
def initialize(title, description)
@title = title
@description = description
@tags = []
end
def save
puts 'we have done it!!!'
end
def as_json(options={})
{
title: title,
description: description,
tags: tags
}
end
end
class BuilderError
attr_reader :field, :msg
include JSONable
def initialize(field, msg)
@field = field
@msg = msg
end
def as_json(options={})
{
field: field,
msg: msg
}
end
end
# make Article only through ArticleBuilder
class ArticleBuilder
attr_reader :errors, :article
def initialize(title = '', description = '')
@article = Article.new(title, description)
@errors = []
@tags = []
end
def valid?
clear_errors!
valid_title!
valid_description!
valid_tags!
errors.size == 0
end
def add_description(val)
@article.description = val
end
def add_tag(val)
@tags << val
end
def add_title(val)
@article.title = val
end
def save
return false unless valid?
@tags.each do |tag_string|
@article.tags << Tag.new(tag_string)
end
@article.save
true
end
private
def clear_errors!
@errors = []
end
def valid_title!
if @article.title.nil? or [email protected]_a?(String) or @article.title.size == 0
@errors.push(BuilderError.new(:title, 'Обязательно заполните title'))
end
end
def valid_description!
if @article.description.nil? or [email protected]_a?(String) or @article.description.size == 0
@errors.push(BuilderError.new(:description, 'Обязательно заполните description'))
end
end
def valid_tags!
check_tags_size and check_tags_content
end
def check_tags_size
if @tags.size == 0 or @tags.size > 3
@errors.push(BuilderError.new(:tags, 'Количество тего должно быть от 1 до 3'))
return false
end
true
end
def check_tags_content
@tags.each do |tag_string|
unless tag_string.is_a?(String)
@errors.push(BuilderError.new(:tags, 'Тег должен быть строкой'))
return false
end
if tag_string.nil? or tag_string.size == 0
@errors.push(BuilderError.new(:tags, 'Обязательно заполните заголовки для всех тегов'))
return false
end
end
true
end
end
# empty article
article_builder = ArticleBuilder.new
article_builder.valid?
# false
article_builder.save
# false
article_builder.errors.to_json
# [{"field"=>"title", "msg"=>"Обязательно заполните title"}, {"field"=>"description", "msg"=>"Обязательно заполните description"}, {"field"=>"tags", "msg"=>"Количество тего должно быть от 1 до 3"}]
# article without tags
article_builder = ArticleBuilder.new
article_builder.add_title('article title')
article_builder.add_description('article description')
article_builder.valid?
# false
article_builder.save
# false
article_builder.errors.to_json
# [{"field"=>"tags", "msg"=>"Количество тего должно быть от 1 до 3"}]
# article with empty tags
article_builder = ArticleBuilder.new('article title', 'article description')
article_builder.add_tag('')
article_builder.valid?
# fasle
article_builder.save
# false
article_builder.errors.to_json
# [{"field"=>"tags", "msg"=>"Обязательно заполните заголовки для всех тегов"}]
# valid article
article_builder = ArticleBuilder.new('article title', 'article description')
article_builder.add_tag('tag title')
article_builder.add_tag('12343')
article_builder.valid?
# true
article_builder.save
# we have done it!!!
# true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment