RubyConf 2022

Never again without a contract: dry-validation

The same as you shouldn't work without a contract, our systems should accept external inputs without one, a written, clear and enforceable one. Define the structure & expected payload being aware of their schema, structure & types. Using dry-schema or dry-validation this part is a matter of a few lines of codes covering most of the cases you may find with the cherry-on-top: error handling out-of-the-box and if this not enough with optional pattern matching for results.

RubyConf 2022

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