SlideShare a Scribd company logo
1 of 59
Download to read offline
Oleksandra Stolyar (Tomilina)
dry-validation vs dry-schema 1.*.*
Harry Potter and…
the Very Important Gem
Update
to the Major Version
“a set of gems that bring solutions
to common problems”
dry-struct
dry-logic
dry-container
dry-validation
dry-transaction
dry-schema
…
dry-rb
Backstory…
ME
dry-validation
Yeah, that feeling…
2017,
February
• Plans for dry-validation + dry-schema (a new gem!) by Piotr Solnica
2019,
January
• dry-schema introduced
2019,
May
• dry-schema v1.0.0 released
2019,
June
• dry-validation v1.0.0 released
gems update timeline
exceptionally about my experience
how I structured knowledge about these gems
features that were crucial for me
workarounds
successes and failures
conclusions, decisions and their consequences
What this talk will be about?
bugs that were fixed since dry-validation 0.13
all great features that dry-validation or dry-schema can provide
What I won’t cover?
The Challenge
Operations gem ‘trailblazer-operation’
Params schema and Validation Macro in operations gem ‘dry-validation’
Error normalization Macro for errors in operations gem ‘error_normalizer’
I had:
Trailblazer Operation v2.0 Contract documentation mentions the ability of validation using:
Dry::Schema (dry-validation < v0.13.3 Schema)
Reform
Trailblazer Macro Contract has dry-validation v0.11.1 dependency
Reform status:
Since September 2019 Emanuele Magliozzi started pushing commits for old and new API compatibility
which use dry-validation < v0.13.3 and dry-validation > v1.0.0 respectively.
In November 2019 he pushed into Trailblazer Reform v2.3.0 with new api which uses
Dry::Validation::Contract
Yet docs are still not updated and 🤔
Trailblazer usage
For same purposes you can use:
dry-transaction (active v0.13.0, release of v1.0.0 is planned but further development will be
stopped)
dry-monads
gem ‘interactor’
Other approaches
That is the question… 🤔
Reusing schemas
Rules
Custom Predicates
Custom Error Messages
Schema/Contract Configuration
Features to migrate:
dry-validation <
0.13
dry-validation > 1.0
(business
validations)
dry-schema > 1.0
(shape & type
validations)
Main changes
Reusing
schemas
Rules
Custom
predicates
Custom
Error
Messages
Configuration
Parameters
dry-validation
(Contract)
dry-schema
Reusing Schemas
{
"sender": {
"first_name": "Draco",
"last_name": "Malfoy"
},
"receiver": {
"first_name": "Lord",
"last_name": "Voldemort"
},
"receiver_address": "Castle",
"text": "I'm scared",
"asap": true
}
it needs to be validated:
Reusing Schemas dry-validation 0.13
optional(:sender).schema(PersonalInfo::FormValidation)
required(:receiver).schema(PersonalInfo::FormValidation)
required(:receiver_address).filled(:str?)
required(:text).filled(:str?)
optional(:asap).filled(:bool?)
module PersonalInfo
FormValidation = Dry::Validation.Schema
required(:first_name).filled(:str?)
required(:last_name).filled(:str?)
end
end
Reusing Schemas dry-validation 1.3.1
params do
optional(:sender).hash(PersonalInfo::FormValidation)
required(:receiver).hash(PersonalInfo::FormValidation)
required(:receiver_address).filled(:string)
required(:text).filled(:string)
optional(:asap).filled(:bool)
end
module PersonalInfo
FormValidation = Dry::Schema.Params do
required(:first_name).filled(:string)
required(:last_name).filled(:string)
end
end
Reusing Schemas dry-schema 1.3.4
optional(:sender).hash(PersonalInfo::FormValidation)
required(:receiver).hash(PersonalInfo::FormValidation)
required(:receiver_address).filled(:string)
required(:text).filled(:string)
optional(:asap).filled(:bool)
module PersonalInfo
FormValidation = Dry::Schema.Params do
required(:first_name) { filled? > str? }
required(:last_name).filled(:string)
end
end
Reusing
schemas
Rules
Custom
predicates
Custom
Error
Messages
Configuration
Parameters
dry-validation
(Contract)
dry-schema
Achieved with
defining Schema
Rules
{
"hogwarts_student": {
"name": "Sasha",
"age": 18,
"parents_owl_id": "hedwig_was_the_best@owail.com",
"has_owl": true,
"has_cat_or_toad": true
}
}
it needs to be validated:
required(:hogwarts_student).schema do
required(:name).filled(:str?)
required(:age).filled(:int?, gt?: 11, lteq?: 18)
required(:parents_owl_id).filled(:str?)
optional(:has_owl).filled(:bool?)
optional(:has_cat_or_toad).filled(:bool?)
rule(inadmissible_animal_quantity:
[:has_owl, :has_cat_or_toad]) do |owl, not_owl|
owl.true? ^ not_owl.true?
end
end
Rules dry-validation 0.13
params do
required(:hogwarts_student).schema do
required(:name).filled(:string)
required(:age).filled(:integer)
required(:parents_owl_id).filled(:string)
required(:has_owl).filled(:bool)
required(:has_cat_or_toad).filled(:bool)
end
end
rule('hogwarts_student.age').validate(gteq?: 11)
rule('hogwarts_student.age').validate(lteq?: 18)
rule(hogwarts_student: [:has_owl, :has_cat_or_toad]) do
unless values[:hogwarts_student][:has_owl] ^ values[:hogwarts_student][:has_cat_or_toad]
key(:owl_errors).failure(:inadmissible_animal_quantity)
end
end
Rules dry-validation 1.3.1
required(:hogwarts_student).schema do
required(:name).filled(:string)
required(:age).filled(:integer, gt?: 11, lteq?: 18)
required(:parents_owl_id).filled(:string)
required(:has_owl).filled(:bool)
required(:has_cat_or_toad).filled(:bool)
end
step :check_inadmissible_animal_quantity
fail AddError('inadmissible_animal_quantity', path: 'has_owl'),
fail_fast: true
def check_inadmissible_animal_quantity(opts, output:, **)
hogwarts_student = output[:hogwarts_student]
hogwarts_student[:has_owl] ^ hogwarts_student[:has_cat_or_toad]
end
Rules dry-schema 1.3.4
{
"hogwarts_house": {
"name": "Slotherin",
"head": "Snape",
"ghost": "Bloody Baron",
"immutable_info": {
"founder_name": "Salazar Slytherin",
"element": "Water",
"flag": "flag_img",
"animal": "Serpent",
"traits": [
"Resourcefulness",
...
"Lineage"
]
},
"common_room": {
"name": "Slytherin Dungeon",
"location": "hell"
}
}
}
it needs to be validated:
required(:hogwarts_house).schema do
# ...
required(:head).filled(:str?,
size?: 1..255,
format?: SOME_MAGIC_REGEX)
# ...
required(:common_room).schema do
required(:name).filled(:str?)
required(:location).filled(:str?, included_in?: %w[tower underground])
end
end
Rules dry-validation 0.13
params do
required(:hogwarts_house).schema do
# ...
required(:head).filled(:string)
# ...
required(:common_room).schema do
required(:name).filled(:string)
required(:location).filled(:string)
end
end
end
rule('hogwarts_house.head') do
key.failure(:invalid_format) unless SOME_MAGIC_REGEX.match?(value)
key.failure(:invalid_size, range: 1..255) unless (1..255).cover?(value.length)
end
rule('hogwarts_house.common_room.location') do
Rules dry-validation 1.3.1
Reusing
schemas
Rules
Custom
predicates
Custom
Error
Messages
Configuration
Parameters
dry-validation
(Contract)
dry-schema
Custom predicates
it needs to be validated:
{
"hogwarts_student": {
"name": "Sasha",
"age": 18,
"parents_owl_id": "hedwig_was_the_best@owail.com",
"has_owl": true,
"has_cat_or_toad": true
}
}
required(:hogwarts_student).schema do
# ...
required(:parents_owl_id).filled(:str?, :owl_id?)
optional(:has_owl).filled(:bool?)
optional(:has_cat_or_toad).filled(:bool?)
end
class CommonSchema < Dry::Validation::Schema::Params
configure do
# ...
end
def owl_id?(value)
OwlLib.valid?(value)
end
end
Dry::Validation.Schema(CommonSchema, {}, &block)
Custom Predicates dry-validation 0.13
params do
required(:hogwarts_student).schema do
# ...
required(:parents_owl_id).filled(:string)
required(:has_owl).filled(:bool)
required(:has_cat_or_toad).filled(:bool)
end
end
## 1
rule(hogwarts_student: :parents_owl_id) do
key.failure(:invalid_owl_id) unless OwlLib.valid?(value)
end
Custom Predicates dry-validation 1.3.0
params do
required(:hogwarts_student).schema do
# ...
required(:parents_owl_id).filled(:string)
required(:has_owl).filled(:bool)
required(:has_cat_or_toad).filled(:bool)
end
end
## 2
rule('hogwarts_student.parents_owl_id') do
unless owl_validator.valid?(value)
key.failure('invalid_owl_id')
end
end
Custom Predicates dry-validation 1.3.0
## 2
class CommonContract < Dry::Validation::Contract
option :owl_validator
end
class OwlValidator
def self.valid?(value)
OwlLib.valid?(value)
end
end
MyContract.new(owl_validator: OwlValidator)
Custom Predicates dry-validation 1.3.0
params do
required(:hogwarts_student).schema do
# ...
required(:parents_owl_id).filled(:string)
required(:has_owl).filled(:bool)
required(:has_cat_or_toad).filled(:bool)
end
end
## 3
rule(hogwarts_student: :parents_owl_id).validate(:owl_id_format)
Custom Predicates dry-validation 1.3.0
class CommonContract < Dry::Validation::Contract
register_macro(:owl_id_format) do
unless OwlLib.valid?(value)
key.failure('not a valid owl id format')
end
end
end
MyContract.new
Custom Predicates dry-validation 1.3.0
Custom Predicates dry-schema 1.3.4
required(:hogwarts_student).schema do
# ...
required(:parents_owl_id).filled(:string)
required(:has_owl).filled(:bool)
required(:has_cat_or_toad).filled(:bool)
end
step Validate()
fail NormalizeErrors(), fail_fast: true
step ValidateOwl(:hogwarts_student, :parents_owl_id)
fail AddError('invalid_parents_owl_id', path: 'parents_owl_id'), fail_fast: true
def ValidateOwl(*args)
step = lambda do |_input, options|
value = options[:output].dig(*args)
OwlLib.valid?(value)
end
end
Custom Predicates dry-schema 1.3.4
Reusing
schemas
Rules
Custom
predicates
Custom
Error
Messages
Configuration
Parameters
dry-validation
(Contract)
dry-schema
Rules
Achieved with
Macro
Custom Error Messages
Custom Error Messages dry-validation 0.13
class CommonSchema < Dry::Validation::Schema::Params
configure do
I18n.config.backend.load_translations('somewhere/custom_error_messages.yml')
config.messages = :i18n
end
end
en:
errors:
bool?: "must be bla bla bla"
owl_number?: "must be in owl number international format"
rules:
inadmissible_animal_quantity: "either owl or something else"
Custom Error Messages dry-validation 1.3.1
class CommonContract < Dry::Validation::Contract
config.messages.load_paths << 'somewhere/custom_error_messages.yml'
end
en:
dry_validation:
errors:
bool?: "must be bla bla bla"
rules:
hogwarts_house:
common_room:
location:
invalid: "must be somewhere in: %{list}"
head:
invalid_format: "must not contain magic"
invalid_size: "length must be within %{range}"
hogwarts_student:
parents_owl_number:
invalid_owl_number: "must be in owl number international format"
owl_errors:
inadmissible_animal_quantity: "either owl or something else"
Custom Error Messages dry-schema 1.3.4
en:
dry_schema:
errors:
bool?: "must be bla bla bla"
CommonConfig = Dry::Schema.Params do
config.messages.load_paths << 'somewhere/custom_error_messages.yml'
end
Reusing
schemas
Rules
Custom
predicates
Custom
Error
Messages
Configuration
Parameters
dry-validation
(Contract)
dry-schema
Configuration parameters
class CommonSchema < Dry::Validation::Schema::Params
configure do
# custom errors files and I18n configs
end
# predicates
# custom validation blocks
end
Dry::Validation.Schema(CommonSchema, {}, &block)
Configuration parameters dry-validation 0.13
Configuration parameters dry-validation 1.3.1
class CommonContract < Dry::Validation::Contract
# custom errors files and I18n configs
# external dependencies
# predicates as macros
end
MyContract.new(
# list of validators
)
Configuration parameters dry-schema 1.3.4
CommonConfig = Dry::Schema.Params do
# custom errors files and I18n configs
# custom types
end
Dry::Schema.Params(
processor: 'Params',
config: CommonConfig.config,
&block
)
Reusing
schemas
Rules
Custom
predicates
Custom
Error
Messages
Configuration
Parameters
dry-validation
(Contract)
dry-schema
Reusing
schemas
Rules
Custom
predicates
Custom
Error
Messages
Configuration
Parameters
dry-validation
(Contract)
dry-schema
Totals
Reusing
schemas
Rules
Custom
predicates
Custom
Error
Messages
Configuration
Parameters
dry-validation
(Contract)
dry-schema
Reusing
schemas
Rules
Custom
predicates
Custom
Error
Messages
Configuration
Parameters
dry-validation
(Contract)
dry-schema
Reusing
schemas
Rules
Custom
predicates
Custom
Error
Messages
Configuration
Parameters
dry-validation
(Contract)
dry-schema
This separation will not only make dry-v much simpler internally, but also allow us to have schemas for
processing/validating input at the HTTP boundary, and then having domain validators that can be called
in the application layer. Schemas and validators can be composed, it means that you’ll be able to specify
schemas and reuse them in validators. This way your application’s domain validation will live in the app
layer, and hairy HTTP processing/validation will be in the HTTP layer (ie controllers, roda routes, etc.)
and this will be possible with 0 code duplication (ie you won’t have to define same attributes in two
places).
The main idea behind dry-schema is to be a fast type checker and a coercion mechanism. It does
support lots of predicates OOTB through dry-logic but it’s important to understand that for “domain
validation” it is not a good fit. Good use cases for dry-schema with additional predicates (as in, other than
type checks) may include things like processing and validating application configuration or HTTP params
pre-processing (before it is passed down to domain layer where further processing may take place).
Proving the idea by Piotr Solnica
How can we draw a line between dry-validation
and dry-schema?
Use dry-validation or use both.
dry-schema for high-level http params
validation
dry-validation for specific and complex
validations, business logic
Ex.:
dry-schema in Controllers
dry-validation in Operations or whatever you
use to process data
Figuring it out
About dry-rb gems
https://www.rubyguides.com/2019/01/what-is-dry-rb/
Piotr Solnica about dry-schema 1.0 release
https://solnic.codes/2019/01/31/introducing-dry-schema/
Piotr Solnica about dry-validation 1.0 release
https://dry-rb.org/news/2019/06/10/dry-validation-1-0-0-released/
Tim Riley “A tour of dry-schema and dry-validation 1.0”
https://speakerdeck.com/timriley/a-tour-of-dry-schema-and-dry-validation-1-dot-0
Igor Morozov upgrading dry-gems
https://www.morozov.is/2019/05/31/upgrading-dry-gems.html
Helpful links:
Questions?
Thanks for listening 🎉🐱

More Related Content

What's hot

JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013
Vladimir Ivanov
 

What's hot (20)

Introduction to Rust
Introduction to RustIntroduction to Rust
Introduction to Rust
 
Rust system programming language
Rust system programming languageRust system programming language
Rust system programming language
 
Hot С++: Universal References And Perfect Forwarding
Hot С++: Universal References And Perfect ForwardingHot С++: Universal References And Perfect Forwarding
Hot С++: Universal References And Perfect Forwarding
 
Celery - A Distributed Task Queue
Celery - A Distributed Task QueueCelery - A Distributed Task Queue
Celery - A Distributed Task Queue
 
Java 8 Workshop
Java 8 WorkshopJava 8 Workshop
Java 8 Workshop
 
Map(), flatmap() and reduce() are your new best friends: simpler collections,...
Map(), flatmap() and reduce() are your new best friends: simpler collections,...Map(), flatmap() and reduce() are your new best friends: simpler collections,...
Map(), flatmap() and reduce() are your new best friends: simpler collections,...
 
Kotlin Coroutines Reloaded
Kotlin Coroutines ReloadedKotlin Coroutines Reloaded
Kotlin Coroutines Reloaded
 
JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013JVM JIT-compiler overview @ JavaOne Moscow 2013
JVM JIT-compiler overview @ JavaOne Moscow 2013
 
Grails GORM - You Know SQL. You Know Queries. Here's GORM.
Grails GORM - You Know SQL. You Know Queries. Here's GORM.Grails GORM - You Know SQL. You Know Queries. Here's GORM.
Grails GORM - You Know SQL. You Know Queries. Here's GORM.
 
Bowling Game Kata C#
Bowling Game Kata C#Bowling Game Kata C#
Bowling Game Kata C#
 
Clean Code: Chapter 3 Function
Clean Code: Chapter 3 FunctionClean Code: Chapter 3 Function
Clean Code: Chapter 3 Function
 
Functional Error Handling with Cats
Functional Error Handling with CatsFunctional Error Handling with Cats
Functional Error Handling with Cats
 
Celery
CeleryCelery
Celery
 
Peeking inside the engine of ZIO SQL.pdf
Peeking inside the engine of ZIO SQL.pdfPeeking inside the engine of ZIO SQL.pdf
Peeking inside the engine of ZIO SQL.pdf
 
Memcache Injection (Hacktrick'15)
Memcache Injection (Hacktrick'15)Memcache Injection (Hacktrick'15)
Memcache Injection (Hacktrick'15)
 
An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...An introduction to Rust: the modern programming language to develop safe and ...
An introduction to Rust: the modern programming language to develop safe and ...
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
 
Detox: tackling the flakiness of mobile automation
Detox: tackling the flakiness of mobile automationDetox: tackling the flakiness of mobile automation
Detox: tackling the flakiness of mobile automation
 
OpenGL 4.4 - Scene Rendering Techniques
OpenGL 4.4 - Scene Rendering TechniquesOpenGL 4.4 - Scene Rendering Techniques
OpenGL 4.4 - Scene Rendering Techniques
 
Kotlin Coroutines in Practice @ KotlinConf 2018
Kotlin Coroutines in Practice @ KotlinConf 2018Kotlin Coroutines in Practice @ KotlinConf 2018
Kotlin Coroutines in Practice @ KotlinConf 2018
 

Similar to Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar | Ruby Meditation 29

Finding bugs that matter with Findbugs
Finding bugs that matter with FindbugsFinding bugs that matter with Findbugs
Finding bugs that matter with Findbugs
Carol McDonald
 

Similar to Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar | Ruby Meditation 29 (20)

Refactoring at Large
Refactoring at LargeRefactoring at Large
Refactoring at Large
 
BarcelonaJUG2016: walkmod: how to run and design code transformations
BarcelonaJUG2016: walkmod: how to run and design code transformationsBarcelonaJUG2016: walkmod: how to run and design code transformations
BarcelonaJUG2016: walkmod: how to run and design code transformations
 
The things we don't see – stories of Software, Scala and Akka
The things we don't see – stories of Software, Scala and AkkaThe things we don't see – stories of Software, Scala and Akka
The things we don't see – stories of Software, Scala and Akka
 
How to not write a boring test in Golang
How to not write a boring test in GolangHow to not write a boring test in Golang
How to not write a boring test in Golang
 
Anti patterns
Anti patternsAnti patterns
Anti patterns
 
The Ring programming language version 1.9 book - Part 53 of 210
The Ring programming language version 1.9 book - Part 53 of 210The Ring programming language version 1.9 book - Part 53 of 210
The Ring programming language version 1.9 book - Part 53 of 210
 
Finding bugs that matter with Findbugs
Finding bugs that matter with FindbugsFinding bugs that matter with Findbugs
Finding bugs that matter with Findbugs
 
The Ring programming language version 1.4.1 book - Part 13 of 31
The Ring programming language version 1.4.1 book - Part 13 of 31The Ring programming language version 1.4.1 book - Part 13 of 31
The Ring programming language version 1.4.1 book - Part 13 of 31
 
Kamil witecki asynchronous, yet readable, code
Kamil witecki asynchronous, yet readable, codeKamil witecki asynchronous, yet readable, code
Kamil witecki asynchronous, yet readable, code
 
Pro typescript.ch03.Object Orientation in TypeScript
Pro typescript.ch03.Object Orientation in TypeScriptPro typescript.ch03.Object Orientation in TypeScript
Pro typescript.ch03.Object Orientation in TypeScript
 
Taller evento TestingUY 2017 - API Testing utilizando Chakram
Taller evento TestingUY 2017 - API Testing utilizando ChakramTaller evento TestingUY 2017 - API Testing utilizando Chakram
Taller evento TestingUY 2017 - API Testing utilizando Chakram
 
Visual sedimentation - IEEE VIS 2013 Atlanta
Visual sedimentation - IEEE VIS 2013 AtlantaVisual sedimentation - IEEE VIS 2013 Atlanta
Visual sedimentation - IEEE VIS 2013 Atlanta
 
Machine Learning and Go. Go!
Machine Learning and Go. Go!Machine Learning and Go. Go!
Machine Learning and Go. Go!
 
Quality Python Homework Help
Quality Python Homework HelpQuality Python Homework Help
Quality Python Homework Help
 
The Ring programming language version 1.10 book - Part 17 of 212
The Ring programming language version 1.10 book - Part 17 of 212The Ring programming language version 1.10 book - Part 17 of 212
The Ring programming language version 1.10 book - Part 17 of 212
 
Oct27
Oct27Oct27
Oct27
 
20.1 Java working with abstraction
20.1 Java working with abstraction20.1 Java working with abstraction
20.1 Java working with abstraction
 
Static Analysis in IDEA
Static Analysis in IDEAStatic Analysis in IDEA
Static Analysis in IDEA
 
The Ring programming language version 1.5.4 book - Part 10 of 185
The Ring programming language version 1.5.4 book - Part 10 of 185The Ring programming language version 1.5.4 book - Part 10 of 185
The Ring programming language version 1.5.4 book - Part 10 of 185
 
FalcorJS
FalcorJSFalcorJS
FalcorJS
 

More from Ruby Meditation

More from Ruby Meditation (20)

Is this Legacy or Revenant Code? - Sergey Sergyenko | Ruby Meditation 30
Is this Legacy or Revenant Code? - Sergey Sergyenko  | Ruby Meditation 30Is this Legacy or Revenant Code? - Sergey Sergyenko  | Ruby Meditation 30
Is this Legacy or Revenant Code? - Sergey Sergyenko | Ruby Meditation 30
 
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...
Life with GraphQL API: good practices and unresolved issues - Roman Dubrovsky...
 
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29
Where is your license, dude? - Viacheslav Miroshnychenko | Ruby Meditation 29
 
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28 How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28
How to cook Rabbit on Production - Bohdan Parshentsev | Ruby Meditation 28
 
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28
How to cook Rabbit on Production - Serhiy Nazarov | Ruby Meditation 28
 
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
 
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
Performance Optimization 101 for Ruby developers - Nihad Abbasov (ENG) | Ruby...
 
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...
Use cases for Serverless Technologies - Ruslan Tolstov (RUS) | Ruby Meditatio...
 
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...
The Trailblazer Ride from the If Jungle into a Civilised Railway Station - Or...
 
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
What/How to do with GraphQL? - Valentyn Ostakh (ENG) | Ruby Meditation 27
 
New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26New features in Rails 6 -  Nihad Abbasov (RUS) | Ruby Meditation 26
New features in Rails 6 - Nihad Abbasov (RUS) | Ruby Meditation 26
 
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26
Security Scanning Overview - Tetiana Chupryna (RUS) | Ruby Meditation 26
 
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...
Teach your application eloquence. Logs, metrics, traces - Dmytro Shapovalov (...
 
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26
Best practices. Exploring - Ike Kurghinyan (RUS) | Ruby Meditation 26
 
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
 
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...
Concurrency in production. Real life example - Dmytro Herasymuk | Ruby Medita...
 
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...
Data encryption for Ruby web applications - Dmytro Shapovalov (RUS) | Ruby Me...
 
Rails App performance at the limit - Bogdan Gusiev
Rails App performance at the limit - Bogdan GusievRails App performance at the limit - Bogdan Gusiev
Rails App performance at the limit - Bogdan Gusiev
 
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23
GDPR. Next Y2K in 2018? - Anton Tkachov | Ruby Meditation #23
 
Postgres vs Elasticsearch while enriching data - Vlad Somov | Ruby Meditaiton...
Postgres vs Elasticsearch while enriching data - Vlad Somov | Ruby Meditaiton...Postgres vs Elasticsearch while enriching data - Vlad Somov | Ruby Meditaiton...
Postgres vs Elasticsearch while enriching data - Vlad Somov | Ruby Meditaiton...
 

Recently uploaded

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Recently uploaded (20)

Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 

Dry-validation update. Dry-validation vs Dry-schema 1.0 - Aleksandra Stolyar | Ruby Meditation 29