00:00:00.000
ready for takeoff
00:00:17.660
okay I like to start so we all
00:00:22.619
have enough time later hopefully I can
00:00:25.800
make it today
00:00:27.539
uh questions so
00:00:30.000
let's go ahead
00:00:32.899
uh this is the talk never again without
00:00:36.719
a contract
00:00:38.160
dry schema and dry validation because
00:00:40.860
the title didn't fit so I had to put
00:00:43.860
just drive validation on the
00:00:46.200
uh
00:00:49.739
on the program but that's good
00:00:54.719
who am I
00:00:56.280
okay it really has a big deal on saying
00:00:59.100
who am I how good you are I'm the top
00:01:02.100
one of rejected uh Ruby talks and
00:01:06.600
Comforts according to speakerline.io
00:01:11.159
okay
00:01:12.720
yeah
00:01:17.939
I I dare you to to go help me put on on
00:01:21.540
accepted
00:01:23.580
uh open source contributors since 2000s
00:01:27.600
my code is in your MacBooks somehow
00:01:32.040
because I've been doing contributions to
00:01:35.220
Ruby cool understand that library but
00:01:39.240
not a big deal
00:01:41.520
my sponsors
00:01:43.500
I'm gonna thank you thank you thank you
00:01:46.320
for the Jane Foundation donation uh who
00:01:49.740
gives me one dollar
00:01:51.899
which make it possible I'm here with all
00:01:55.380
you
00:01:56.759
thank you Ryan thank you thank you I
00:01:59.700
really appreciate your foundation is
00:02:01.619
gonna be
00:02:02.820
bigger bigger and better than
00:02:05.460
another Ruby Center
00:02:07.020
yeah
00:02:09.360
okay I work for a company called any
00:02:13.020
road
00:02:14.040
as a staff software engineer and
00:02:17.760
Technical lead
00:02:19.319
uh I don't know exactly what it means
00:02:21.780
but it means that I'm I'm old I know
00:02:24.180
some stuff here and there after 20 years
00:02:26.580
of being in in this industry
00:02:29.760
uh oh but
00:02:32.760
so let's go I just said my name no idea
00:02:35.520
my name is
00:02:37.340
but I go by Sparta everywhere
00:02:47.959
please join if you ever
00:02:51.360
uh this is the agenda we're gonna have
00:02:54.420
the intro the what the why The Who
00:02:59.160
and conclusions
00:03:01.200
okay
00:03:02.160
be with me this is gonna be
00:03:04.260
uh a lot of things to to see but
00:03:07.920
we're gonna make it
00:03:12.720
uh
00:03:14.340
at least an actual time in my free space
00:03:16.920
job I was exploited
00:03:19.080
uh it was uh what I learned a lot
00:03:22.760
it makes any consolations
00:03:25.440
I was paying cash every 10 days
00:03:29.879
don't ask me why
00:03:31.560
at some point I got chickenpox I report
00:03:34.260
myself I think told me it's okay come
00:03:37.760
back whenever you feel ready
00:03:40.980
yeah you have no what happened right
00:03:42.980
when I got better I went back to that
00:03:46.140
job I was tall I have no job anymore
00:03:50.640
is it oh my God okay thank you that's
00:03:54.720
what I said
00:03:56.099
yeah never again
00:03:59.459
without a contract
00:04:03.180
and that's for that day I I was 17 19
00:04:06.599
years old
00:04:07.920
and that happened a lot of times
00:04:11.580
so
00:04:12.659
I tried to quit go ahead oh never again
00:04:15.180
but I try it was never never never about
00:04:19.859
we we could drive
00:04:23.820
let's go
00:04:25.139
what about the ski mask thing
00:04:28.080
is very much as Jason schema but better
00:04:32.580
uh if you're not I don't want to spend
00:04:34.979
too much time you can Google this for
00:04:36.540
this you're gonna try to get into the
00:04:38.280
point as strong
00:04:40.080
uh since Ruby can be used since it's
00:04:43.740
pure Ruby can use on any Ruby data
00:04:46.440
structure including jsons is more
00:04:49.080
focused sales on the structures on tags
00:04:53.040
a structural validation
00:04:56.660
using filters introspection with Rural
00:04:59.940
and ASDS
00:05:01.259
is very performant it's fast it's
00:05:04.199
working a lot of composition and reuse
00:05:08.400
um
00:05:09.419
as a nice vsl increase sanitation
00:05:12.740
question type checking
00:05:15.900
can be used on mobile orientation
00:05:17.940
fashion but it has a functional
00:05:21.240
programming approach
00:05:22.979
so yes include monots
00:05:26.400
ah it's been it has been chilled that if
00:05:29.699
you mention that you have to go to the
00:05:33.539
definition of Palace I'm gonna try to go
00:05:36.000
directly to them
00:05:37.860
okay
00:05:39.060
Ocho
00:05:40.520
monats is X is just a monoid on the
00:05:44.100
category or Ender functions of X with
00:05:48.539
product a replacement of composition of
00:05:51.660
end of vultures and unit cells and
00:05:54.360
identity and the function
00:05:57.600
got it
00:05:59.340
is not my definition it's right there
00:06:01.259
the the answer is like overflow okay
00:06:05.880
what are you with me okay nobody's
00:06:09.000
leaving right okay this hope is not
00:06:11.759
nobody nobody's leaving
00:06:17.520
anyone have seen this
00:06:20.520
have you ever seen this later you can
00:06:23.220
Google it because we don't have time
00:06:25.139
it's a return carburetor for me the
00:06:27.840
first time I already
00:06:29.580
because it's too many math in there
00:06:32.819
but maybe if I say in Spanish it's
00:06:35.639
better for you you can understand better
00:06:37.440
right because the math doesn't make
00:06:39.240
sense let's say in Spanish I have a few
00:06:41.759
Spanish speakers here that can be with
00:06:43.680
me
00:06:45.120
go ahead
00:06:46.740
is
00:06:58.500
it better
00:07:00.900
no
00:07:02.340
no anyway what you're saying now I mean
00:07:04.860
this is clear you didn't get the math
00:07:07.440
but you get Spanish you have been eating
00:07:09.900
tacos all this time
00:07:12.419
no okay
00:07:14.340
don't worry we're gonna get there
00:07:17.639
uh let's talk about earlier about
00:07:19.500
contracts or with me on dry contacts at
00:07:22.319
some point schemas are not enough
00:07:24.620
continuing to contain what we mean to do
00:07:27.360
the next natural step is create
00:07:29.880
contracts uh whenever rules and
00:07:32.759
conditions May apply
00:07:35.220
it's like anything in your life because
00:07:38.220
you don't have to do a control for
00:07:39.840
literally everything like I'm going to
00:07:42.120
do a contract with my wife oh wait I
00:07:44.160
mean I did
00:07:45.740
I marry her another example but do you
00:07:49.979
know what I mean you don't have to do a
00:07:51.360
contract every single day but as long as
00:07:53.639
we get agree on something
00:07:55.759
instead of structure
00:07:57.780
and what is in the structure we are
00:07:59.639
confined you don't have to do a content
00:08:01.319
on every single thing you're doing so
00:08:03.360
that's why they're never again we are
00:08:05.160
content is gonna lie
00:08:07.080
but I have to do something to be
00:08:09.120
accepted you know what I mean and this
00:08:12.180
this conferences
00:08:13.620
sorry
00:08:16.259
bad joke
00:08:17.699
I love Ruby Center
00:08:21.599
ah contracts including the definition of
00:08:24.720
the schemas power for dry schemas
00:08:26.940
including macros dependence injection
00:08:29.160
and rules uh I cannot be compressed
00:08:32.880
everything in this presentation because
00:08:34.740
only 30 minutes but what could I do
00:08:36.539
super fast
00:08:38.159
on the what we can do
00:08:42.360
okay
00:08:43.500
if you are still here you may be asking
00:08:46.440
why
00:08:50.060
have you heard about that but
00:08:53.300
uh most frequently than never our system
00:08:56.399
starts to grow to scale to get more
00:08:59.459
complex communication and internal and
00:09:01.500
external agents so it means uh it's not
00:09:05.820
all about forms getting into your
00:09:08.220
controller is nested assigned attribute
00:09:11.640
so what not this is not about that I
00:09:14.220
mean at some point you're gonna grow and
00:09:17.339
sadly you have to don't trust uh whoever
00:09:22.260
send you a payload to your controller
00:09:25.080
I'm not saying everybody is bad but
00:09:27.540
everybody is bad in Internet so don't
00:09:30.180
trust
00:09:31.620
especially if it's an API even if they
00:09:34.380
have a security on on authentic
00:09:37.260
Authentication
00:09:39.360
none
00:09:41.959
the schemas and contacts may play a role
00:09:44.940
and if I were acceptable inputs for our
00:09:48.240
systems acceptables at that point
00:09:51.660
it's not exactly the main focus but
00:09:54.480
since the security is implicit here
00:09:56.339
you're gonna let go in a lot of things
00:10:00.060
that may hurt your system there is a lot
00:10:03.180
of layers where they can stop this stop
00:10:05.160
but at the end at some point it's going
00:10:08.459
to go into your application
00:10:10.320
so we're gonna try today it's not
00:10:13.560
security focus is we I may have some
00:10:16.560
about that later but not right now
00:10:20.580
second and I've been when I was pitching
00:10:23.339
this this uh talk with you uh but so
00:10:27.959
active mode is enough yes it is if your
00:10:32.220
company is a block you wrote in 30
00:10:34.320
minutes
00:10:35.940
uh maybe some don't get that that famous
00:10:39.420
uh presentation of doing a block of 30
00:10:42.480
minutes would raise but your company is
00:10:45.180
not a block you did in 30 minutes
00:10:49.140
hopefully if it is it's time for me
00:10:52.519
you're okay
00:10:54.300
uh if a key mode has been enough if your
00:10:56.880
data has never been that complex that's
00:10:58.920
okay you don't have to change every
00:11:00.720
single time
00:11:02.279
a strong parameters is enough
00:11:04.740
again yes it is you need to apply rules
00:11:07.980
you need to have questions so nothing
00:11:09.839
that you this kind of things that you
00:11:11.339
care about it's just fine
00:11:13.200
but at some point you're gonna needed
00:11:15.720
unlikely hopefully
00:11:17.899
uh Ryan big my benefactor is sponsor
00:11:21.600
recently wrote this uh you can go
00:11:24.120
ryanbake.com and it will be there on the
00:11:27.180
blog post which saves me about 10
00:11:29.640
minutes of this stuff thank you for that
00:11:32.339
presentation thank you Ryan again
00:11:36.380
Ryan I recommend Andreas recommend this
00:11:39.420
book oh no please look
00:11:42.540
he changed their name
00:11:45.420
it was not very accepted acceptable
00:11:48.360
doing that
00:11:50.000
uh why is all about boundaries and what
00:11:54.120
projects is a good practice I'm not
00:11:56.339
recording here uh to leverage in the
00:11:59.100
schemas and contacts uh so the bad
00:12:01.500
ground would need the data don't cross
00:12:03.899
the brain rear uh and goes further than
00:12:07.019
you should go beyond the controller
00:12:09.300
that's what I mean
00:12:10.920
again it's all about the schemas is not
00:12:13.980
just for web it's basically every
00:12:16.140
boundary who needs to be sure you may or
00:12:18.839
may not you never know uh have bad
00:12:21.420
consequences
00:12:23.100
thank you
00:12:23.880
okay let's see they have
00:12:27.839
let's take a use case your company needs
00:12:31.019
to connect with other using a standard
00:12:33.839
or the other way around for the sake of
00:12:36.240
this
00:12:37.079
uh use something open let's write
00:12:39.120
octo.travel
00:12:41.220
is like this
00:12:42.920
and let's say the most basic uh
00:12:46.740
endpoint you can have this is the one of
00:12:49.440
on your server you have a product and
00:12:52.260
you pass along the ID
00:12:54.180
uh and that's it it's the most basic
00:12:56.220
thing we're gonna try to get there
00:12:58.680
you you're supposed to create this for
00:13:01.139
them it's gonna hit you on a guess
00:13:04.019
request
00:13:06.420
and this is the most basic thing you you
00:13:08.519
can have because our business says our
00:13:11.579
products are all usual ideas not any
00:13:15.240
kind of like this is not can be like a
00:13:18.680
400 characters string which must be an
00:13:23.279
ID you can do that you say is required
00:13:29.160
that is feel
00:13:31.860
as usual ID
00:13:33.839
and don't mind too much about the name
00:13:36.360
right now it's baseball we try to get
00:13:38.399
there again
00:13:40.800
this is kind of how we do don't take too
00:13:44.100
much attention here because it's the
00:13:45.540
base model
00:13:47.579
which is this you create a product just
00:13:50.040
to have a name which makes sense
00:13:53.399
and we are done
00:13:55.100
how do you define that whenever this
00:13:57.779
input which is a hash like
00:14:00.720
uh must be this way uh we had a lot of
00:14:04.620
tests here in order to be sure that
00:14:06.839
nothing crosses along
00:14:09.000
and then you use it uh deadline 15
00:14:12.240
that's where you use it I'm using here
00:14:15.120
an API how many API so it doesn't have
00:14:18.300
to be raised again uh and when that's
00:14:21.420
when we use
00:14:23.040
this this class I just create well
00:14:26.339
there's another class is an object
00:14:29.339
and
00:14:32.180
the parameter coming from the word
00:14:34.380
framework I don't care that much it's
00:14:36.420
parameter like any other parameter or
00:14:38.339
any other
00:14:39.660
web framework
00:14:41.339
and then you convert to monits
00:14:45.420
wait bear with me
00:14:47.519
and then do pattern match which is kind
00:14:51.300
of the the cherry on top
00:14:54.779
what can we do with this is I barely did
00:14:58.500
nothing but defined the schema
00:15:02.040
right
00:15:04.139
and it's kind of plain English because
00:15:06.480
now you say on the monarchs
00:15:09.240
in case you have a failure
00:15:13.199
say the status on 400 and recognize Json
00:15:18.300
I just do the curve because why not uh
00:15:22.440
the the hit
00:15:24.000
to this endpoint
00:15:25.800
and return me just like that I I didn't
00:15:28.139
did that the framework the tool itself
00:15:31.199
give me that
00:15:33.480
go back there's nothing
00:15:36.540
just like that and you have the
00:15:39.420
validation because I pass along
00:15:41.519
at 12 which comes along with a string
00:15:45.360
which means like an integer but doesn't
00:15:47.760
get into into there because it's not the
00:15:50.820
what I was expecting even you hit me
00:15:53.519
with this this thing you just save me
00:15:55.740
four kilobytes of payload on ID I don't
00:15:59.040
care reject you because you don't
00:16:01.620
complain with my requirements
00:16:04.560
second
00:16:06.019
if the results of the monat
00:16:09.600
is a success
00:16:11.459
return the Json note please
00:16:14.579
the constructed value right there Json
00:16:18.120
ID column ID that came from the success
00:16:23.519
okay so again I did nothing but defined
00:16:27.060
schema when I convert
00:16:30.480
his writer
00:16:32.339
I pass along it's not it's clear enough
00:16:35.160
but these are a usual ID
00:16:38.459
and I returning exactly what I meant you
00:16:41.279
see Json id id
00:16:43.440
just write the ID
00:16:45.300
are you still with me see my name is not
00:16:48.000
that difficult
00:16:49.560
it's just Fury out how I meant to
00:16:53.639
create a structure the tool is that good
00:16:56.220
that you have to do nothing but Define
00:16:58.380
destruction
00:16:59.459
okay let's go with something more
00:17:01.560
complicated it's the same the same
00:17:03.540
website now the payload is this
00:17:06.600
product ID
00:17:08.579
is option ID local sets data style
00:17:13.040
and they have a definition exactly what
00:17:16.140
they mean exactly the format and the
00:17:20.100
recently on the last part of the of the
00:17:23.520
right uh the units which says if you see
00:17:28.860
there's something that says require
00:17:30.540
require and whatever is not say required
00:17:34.440
means it's optional
00:17:36.539
but inside these units it says is
00:17:39.960
required again so how so what it means
00:17:42.720
if you send this field called units
00:17:46.380
inside this field which is an array
00:17:50.400
they must be an ID type string and they
00:17:55.020
must be a quantity the type integer both
00:17:58.799
conditions should be applied
00:18:01.799
as you see on the on the left uh I
00:18:04.740
Define everything exactly like how it is
00:18:07.080
required required optional optional
00:18:10.500
optional optional units array
00:18:13.740
of units
00:18:15.600
just this thing about this array
00:18:18.660
with units
00:18:20.880
pay all the learning
00:18:23.460
I dare you to try this on optic model
00:18:27.360
they have this kind of validation inside
00:18:30.000
and inside and inside because I didn't
00:18:33.240
Define this not that long because inside
00:18:35.760
the I defined in the units which is
00:18:38.880
guess what another schema
00:18:42.419
is there it's a schema that says
00:18:46.620
I require quantity and I require ID is
00:18:51.660
my it doesn't matter documentation if
00:18:54.000
you see there's something called parent
00:18:57.720
which is based on the base model
00:18:59.340
remember the base model that's what it
00:19:01.559
is I defined before because it's my
00:19:04.500
business I know the IDS are all give you
00:19:07.799
ideas so I defined it before I do a lot
00:19:10.799
of tests about that and then I reduce it
00:19:13.679
as composition that's a composition path
00:19:16.559
so I don't have to test it again I just
00:19:18.900
test again this quantity because about
00:19:21.059
the ID is already test
00:19:23.460
it's done
00:19:26.520
uh now it's going to be an exercise it's
00:19:29.280
not about that but imagine to create a
00:19:31.500
change so the product's endpoint the
00:19:33.419
thing we have
00:19:34.620
but now I require uh to have a look at
00:19:37.740
the start look at the end
00:19:40.080
which one rule both are optional
00:19:44.160
but if you required both must be
00:19:48.780
wants to be present and the star should
00:19:51.960
be before the end so it makes a lot of
00:19:54.840
sense so that's when schema doesn't fit
00:19:57.120
because the scheme is about the
00:19:58.620
structure and what is inside your
00:20:00.299
structure and what's the types and
00:20:02.039
whatnot but it's not about rules
00:20:04.860
so let's go deeper is this because
00:20:09.000
when you when you see it we're gonna
00:20:11.340
create a contract
00:20:13.080
and I said it's going to have params
00:20:16.620
inside the parents means it's going to
00:20:19.080
be a schema product the same when I
00:20:21.900
Define which is the same one as a base
00:20:25.320
model
00:20:26.580
and then another schema which is the
00:20:29.580
optional local dates this is a new one
00:20:32.039
we're gonna pass along to that this is a
00:20:34.500
new one when I said it's optional
00:20:37.799
uh local date star and look at the end
00:20:40.200
it needs to be a Json date I can explain
00:20:42.720
that variable this the date this kind of
00:20:45.900
update it's gonna be coerce that's the
00:20:48.059
part of coercion
00:20:49.500
because they pass along a string I'm
00:20:52.980
gonna treat as a date and convert to a
00:20:56.640
date type whenever this schema is apply
00:21:01.620
again
00:21:02.940
validation this is a contract which has
00:21:05.580
which the scheme as a programs uh with
00:21:08.940
product and look at it does the schema
00:21:11.340
up here the documentation ID
00:21:15.840
and then I Define the rules
00:21:18.179
the rules is first if you supply local
00:21:22.380
data start
00:21:24.000
please also send the local date in
00:21:27.299
because I can do nothing on this this is
00:21:29.400
just my contract it doesn't have to be
00:21:31.260
that way you can do it whatever you want
00:21:33.179
on your route but my rule is to the fact
00:21:36.900
you send me over they look at it started
00:21:39.780
with cheese at Json date
00:21:42.059
the answer media the other way around
00:21:44.760
second rule if you supply look at the
00:21:46.919
end then send me to look at this time it
00:21:49.500
makes sense
00:21:51.120
and the three rules is you send both
00:21:54.419
then
00:21:55.520
uh created you see the key failure it
00:21:59.460
says the the key part because it's kind
00:22:01.320
of the blocks and Ruby this rule if you
00:22:04.740
break it I gonna uh break the contract I
00:22:09.059
mean you're gonna predict culture
00:22:10.919
say you're more supplied okay that's a
00:22:14.159
message
00:22:15.059
you most applied uh local date start
00:22:18.780
and the other one is you it must be
00:22:20.760
local so I'm gonna try it again
00:22:25.020
and now
00:22:26.940
I'm gonna use it this is the same
00:22:28.679
endpoint I had
00:22:30.480
now instead of the schema I'm gonna use
00:22:33.059
the same
00:22:34.559
but now as a contract
00:22:37.799
and I pass along another parameters
00:22:40.080
because it doesn't this content needs
00:22:42.539
the information the input
00:22:45.000
and now this is new
00:22:48.299
we say in case
00:22:50.940
it's a success
00:22:52.740
and this success
00:22:54.720
has local date start and look at the end
00:22:57.780
as part of the transformation
00:23:01.260
then
00:23:02.640
to the Json and call this process data
00:23:05.960
with this it doesn't matter about that
00:23:08.340
it's just do something with that and
00:23:10.980
they constructing this value
00:23:13.080
which is different than the other so the
00:23:15.659
the other one is still working I just
00:23:17.760
add in a contract and I'm adding a
00:23:19.919
constraint on saying what is happening
00:23:22.380
again and try to send data
00:23:25.500
with a the same ID with the local start
00:23:29.520
date if I don't Supply it it says You
00:23:32.280
must apply local date
00:23:34.020
the other way around you don't Supply
00:23:35.880
you multiply it look at the start
00:23:38.880
and if you date doesn't fit on this is
00:23:42.539
before the Builder will say
00:23:44.580
look at the end must be asked to look at
00:23:46.980
this that's it
00:23:48.299
in playing English you define your rules
00:23:51.720
and everything is done of course you
00:23:54.419
have to test don't forget to test done
00:23:56.720
trust not either the main Developers
00:24:00.299
test it anyway
00:24:02.159
right if you are good you're sending
00:24:05.340
everything I will remember I I was a
00:24:08.820
serializer the silencer did that with
00:24:11.820
the input which was update you see 2022
00:24:15.539
11 29
00:24:17.159
and the other one I transformed to units
00:24:20.280
timestamp that's what I did
00:24:22.320
you can do of course wherever you want
00:24:24.000
with that but that's that's just the
00:24:26.159
most simple example I have in order to
00:24:28.380
be make it so it's not difficult to
00:24:31.740
monitors once you get what it means it's
00:24:34.320
just a kind of transformation of data
00:24:37.440
around to end on fractures why not it's
00:24:42.059
easier now
00:24:44.400
Cinco
00:24:45.840
conclusions
00:24:48.780
race game is great to have as the phase
00:24:50.940
boundary between your system and other
00:24:52.940
microorganics and assistance it's also a
00:24:56.100
great way to create and simplify your
00:24:57.840
concept of your boundaries
00:25:00.720
you don't have to change all your actual
00:25:03.419
form objects or missionaries I I'm not
00:25:06.720
here to say that
00:25:08.159
you can continue you can move around
00:25:09.960
whenever fit your needs but again it's
00:25:13.320
all our boundaries
00:25:15.600
all this is on this repo
00:25:18.659
so it com it's complete with
00:25:21.919
149 test assertions which runs on 0.5
00:25:27.440
milliseconds all of them
00:25:30.179
right but I told you about boundaries
00:25:32.400
right it's not about extract the
00:25:36.120
the
00:25:38.400
uh
00:25:39.539
the structure and the schemas and uh
00:25:43.500
um contracts from that you can go ahead
00:25:47.039
and do something like that this repo is
00:25:49.380
using this structure the schemas is in
00:25:53.460
one folder
00:25:54.840
with the Run get directory
00:25:58.380
which runs their own test
00:26:01.679
inside I mean that's their own
00:26:04.919
it's called business the folder
00:26:07.980
I created another application which is
00:26:10.580
using a money API which consumes the
00:26:15.600
basic schema contracts as you see in the
00:26:18.360
code
00:26:19.440
and witches are mounted on a main
00:26:22.559
application on Roda
00:26:24.659
using that like it seems like a weird it
00:26:28.140
doesn't why because your content is
00:26:31.200
going to change constantly so what I did
00:26:33.840
for this repo is the first ones it's a
00:26:37.320
gem
00:26:38.760
which you can version
00:26:40.860
so whatever your client is using all
00:26:43.440
contracts they can keep using whatever
00:26:45.779
they they want you can construct new
00:26:48.419
contracts and use another application to
00:26:51.419
to do the same
00:26:54.120
it's like that remember the business
00:26:56.159
contract product just using that uh but
00:27:00.059
the same API is also a gym
00:27:03.179
which I mount on business API new this
00:27:06.419
can you can check it out the report it's
00:27:08.460
kind of complex but it's binary I have
00:27:11.460
my contracts in their own Ripple it's a
00:27:14.340
mono repo actually it's not separate
00:27:16.440
report it's the same get get
00:27:19.520
uh project
00:27:21.900
this is not separate projects but all of
00:27:24.840
them have their own structure is
00:27:27.120
separate like we we don't have to match
00:27:29.039
each other I don't have to test database
00:27:31.080
on my schemas it didn't make no sense
00:27:34.440
what I can test the web on the API I
00:27:38.039
mean the request on the API level which
00:27:40.620
would should be slower than the other
00:27:42.480
ones of
00:27:44.279
as you can see
00:27:45.480
I want to thank you of course uh the
00:27:48.059
main there's a lot of people in there
00:27:50.039
but the main developers of these
00:27:53.400
libraries are Nikita
00:27:55.980
Peter Anthony Riley I please have run a
00:27:59.820
plus for them because they are doing a
00:28:01.799
lot of work you haven't if you haven't
00:28:04.320
heard about dry RB you may have heard
00:28:07.380
about Hanami recently right but a lot of
00:28:12.360
things don't have money are on top
00:28:14.400
of dryery so I I'm very thinking about
00:28:18.480
all the what they have done
00:28:21.360
uh if you were curious about all these
00:28:23.640
illustrations this is why how what I get
00:28:26.100
it's called Little Buddy lyrics
00:28:29.900
19th century it's
00:28:32.580
it's kind of weird okay I'm gonna ask
00:28:34.559
you soon they are free I mean they're
00:28:36.299
they're out there are the headlong
00:28:38.640
thank you the previous Library I was
00:28:40.620
able to to get it for free I had to pay
00:28:43.380
no royalty I guess
00:28:48.480
um that's it thank you