Description
Martin Renvoize (ashimema)
2024-04-18 12:45:08 UTC
Created attachment 165086 [details] [review] Bug 36641: Add endpoint for fetching circulation rules This patch is a proof of concept for an API endpoint that returns a list of circulation rules for the specified itemtype, branchcode and patron category combination. You can also add a list of `rules` as a query parameter to limit the response to only the rules you are interested in for this combination. Setting to NSO to get eyes.. but right at this moment it would fail QA for lack of tests. I want feedback specifically on the URL and the form of the response and if we're happy for it to be an open object or want to a spec for it with each of the available circ rule keys listed but optional. A few remarks: * The order of the path parameters is arbitrary, right? I assume you thought about it * The parameter names should be fixed to our current uses * The returned structure is under specified * I never liked /circulation-rules, can we make it /circulation_rules so it matches all other routes? I'm looking to come back to this now. OK, so you'd like me to update the existing endpoint to `/circulation_rules/kinds` and add mine as `/circulation_rules`. I can do that.. though do we know if anyone out there is using the /kinds route already? I did think about the order of parameters, though I not wed to it. I had them as path params as I felt it made it clearer that the endpoint expects all of them to be filled.. however we could just have them as query params and then order is inherently meaningless and in fact we don't actually always needs all of them really. Yes, I said the return structure is underspecified.. but it's also a bit variable.. I'll try to see what I can come up with. Are you saying you want the 'kinds' param to be an enum of all rule kinds.. I was sort of trying to avoid having to list those again.. I wish it was simple to build this particular list from code to embed into the spec.. maybe I can.. I'll investigate. (In reply to Martin Renvoize from comment #4) > OK, so you'd like me to update the existing endpoint to > `/circulation_rules/kinds` and add mine as `/circulation_rules`. I can do > that.. though do we know if anyone out there is using the /kinds route > already? Consider in testing now, it's already broken I think we're safe to change it now. Created attachment 167937 [details] [review] Bug 36641: Add endpoint for fetching circulation rules This patch is a proof of concept for an API endpoint that returns a list of circulation rules for the specified itemtype, branchcode and patron category combination. You can also add a list of `rules` as a query parameter to limit the response to only the rules you are interested in for this combination. Created attachment 167938 [details] [review] Bug 36641: (follow-up) Requested changes This patch does a few things: 1) Moves /circulation-rules to /circulation_rules 2) Adds a the missing permission to /circulation_rules/kinds 3) Updates the circ-rule-kind definition to allow for the new fields added since the route was first defined 4) Adds a 'render_invalid_parameter_value' helper to ::Responses 5) Uses the above helper to render a 400 when an invalid branchcode, itemtype or patron category code is used for filtering 6) Converts from required path based parameters to optional query based parameters. 7) Refined the definition for the 'rules' response so we now only allow for 'string' or 'integer' values for the keys in the response. I'm still not especially happy with the /kinds endpoint but at least with this patch it responds something.. I think we should handle cleaning it up properly in another bug. I am fairly happy with the end result of the follow-up however. Please let me know what you think Tomas. Created attachment 167946 [details] [review] Bug 36641: Add endpoint for fetching circulation rules This patch is a proof of concept for an API endpoint that returns a list of circulation rules for the specified itemtype, branchcode and patron category combination. You can also add a list of `rules` as a query parameter to limit the response to only the rules you are interested in for this combination. Created attachment 167947 [details] [review] Bug 36641: (follow-up) Requested changes This patch does a few things: 1) Moves /circulation-rules to /circulation_rules 2) Adds a the missing permission to /circulation_rules/kinds 3) Updates the circ-rule-kind definition to allow for the new fields added since the route was first defined 4) Adds a 'render_invalid_parameter_value' helper to ::Responses 5) Uses the above helper to render a 400 when an invalid branchcode, itemtype or patron category code is used for filtering 6) Converts from required path based parameters to optional query based parameters. 7) Refined the definition for the 'rules' response so we now only allow for 'string' or 'integer' values for the keys in the response. NOTE: The multi for the 'rules' query parameter fails to work at the moment. Created attachment 168018 [details] [review] Bug 36641: Introduce render_invalid_parameter_value helper This patch introduces a new 'render_invalid_parameter_value' helper method that accepts 'path' and 'values' parameters to denote which field has failed validation and where the end user can get valid options. Created attachment 168019 [details] [review] Bug 36641: Add endpoint for fetching circulation rules This patch adds an endpoint for fetching ciruclations rules given the constraints of the passed parameters. We optionally expect item_type, library and patron_category as query parameters and we return a list of relevant circulation rules pertaining to that combination of requirements. You can also add a list of `rules` as a query parameter to limit the response to only the rules you are interested in for this combination. Created attachment 168020 [details] [review] Bug 36641: WIP - Add unit tests for /circulation_rules Created attachment 168023 [details] [review] Bug 36641: Introduce render_invalid_parameter_value helper This patch introduces a new 'render_invalid_parameter_value' helper method that accepts 'path' and 'values' parameters to denote which field has failed validation and where the end user can get valid options. Created attachment 168024 [details] [review] Bug 36641: Add unit tests for /circulation_rules Created attachment 168025 [details] [review] Bug 36641: Add endpoint for fetching circulation rules This patch adds an endpoint for fetching ciruclations rules given the constraints of the passed parameters. We optionally expect item_type, library and patron_category as query parameters and we return a list of relevant circulation rules pertaining to that combination of requirements. You can also add a list of `rules` as a query parameter to limit the response to only the rules you are interested in for this combination. Created attachment 168365 [details] [review] Bug 36641: Introduce render_invalid_parameter_value helper This patch introduces a new 'render_invalid_parameter_value' helper method that accepts 'path' and 'values' parameters to denote which field has failed validation and where the end user can get valid options. Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 168366 [details] [review] Bug 36641: Add unit tests for /circulation_rules Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 168367 [details] [review] Bug 36641: Add endpoint for fetching circulation rules This patch adds an endpoint for fetching ciruclations rules given the constraints of the passed parameters. We optionally expect item_type, library and patron_category as query parameters and we return a list of relevant circulation rules pertaining to that combination of requirements. You can also add a list of `rules` as a query parameter to limit the response to only the rules you are interested in for this combination. Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 168368 [details] [review] Bug 36641: Harmonize parameter names Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 168369 [details] [review] Bug 36641: Make tests cover all code paths Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 168370 [details] [review] Bug 36641: Make tests cover all code paths Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Hi, this all looks great. I would go with a straight QA, but I want your opinion, Martin on wrapping it in a try/catch block, having the usual `$c->unhandled_exception($_);`. (In reply to Tomás Cohen Arazi from comment #23) > Hi, this all looks great. I would go with a straight QA, but I want your > opinion, Martin on wrapping it in a try/catch block, having the usual > `$c->unhandled_exception($_);`. That's not a bad idea.. I did wonder it briefly myself.. I forget now why I didn't add it.... hmm Thanks for all the work here btw, really appreciate it. Created attachment 168378 [details] [review] Bug 36641: (follow-up) Wrap in a try/catch block This patch adds the missing try/catch and unhandled exception error handler to the new list_effective_rules endpoint. Created attachment 168379 [details] [review] Bug 36641: (follow-up) Wrap in a try/catch block This patch adds the missing try/catch and unhandled exception error handler to the new list_effective_rules endpoint. Created attachment 168395 [details] [review] Bug 36641: Introduce render_invalid_parameter_value helper This patch introduces a new 'render_invalid_parameter_value' helper method that accepts 'path' and 'values' parameters to denote which field has failed validation and where the end user can get valid options. Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168396 [details] [review] Bug 36641: Add unit tests for /circulation_rules Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168397 [details] [review] Bug 36641: Add endpoint for fetching circulation rules This patch adds an endpoint for fetching ciruclations rules given the constraints of the passed parameters. We optionally expect item_type, library and patron_category as query parameters and we return a list of relevant circulation rules pertaining to that combination of requirements. You can also add a list of `rules` as a query parameter to limit the response to only the rules you are interested in for this combination. Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168398 [details] [review] Bug 36641: Harmonize parameter names Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168399 [details] [review] Bug 36641: Make tests cover all code paths Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168400 [details] [review] Bug 36641: (follow-up) Wrap in a try/catch block This patch adds the missing try/catch and unhandled exception error handler to the new list_effective_rules endpoint. Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168401 [details] [review] Bug 36641: (QA Follow-up) Fix variable name I'm re-considering this slightly Created attachment 168841 [details] [review] Bug 36641: (follow-up) Update to allow returning non-effective rules This patch updates the existing /circulation_rules endpoint introduced in this patchset to allow return of all rule sets rather than only the effective set. We continue to default to the effective set for the parameters passed which will mean by default you will get an arrayref containing one hashref entry with each rule kind as a key in that hashref. However, if you add 'effective=false' as a query parameter, you will now have an arrayref of all rule sets that match your passed criteria including rules that may have fallen back to defaults in the effective case. WIP: Need to add support for * in branch, itemtype, patron category query parameters to allow explicit return of default rules vs no filter passed. (i.e. for the effective=false case where all rules for should be returned when no filters are passed vs * passed to filter to just default rules vs specifics passed for branch/item/patron filtering. Created attachment 168874 [details] [review] Bug 36641: Introduce render_invalid_parameter_value helper This patch introduces a new 'render_invalid_parameter_value' helper method that accepts 'path' and 'values' parameters to denote which field has failed validation and where the end user can get valid options. Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168875 [details] [review] Bug 36641: Add unit tests for /circulation_rules Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168876 [details] [review] Bug 36641: Add endpoint for fetching circulation rules This patch adds an endpoint for fetching ciruclations rules given the constraints of the passed parameters. We optionally expect item_type, library and patron_category as query parameters and we return a list of relevant circulation rules pertaining to that combination of requirements. You can also add a list of `rules` as a query parameter to limit the response to only the rules you are interested in for this combination. Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168877 [details] [review] Bug 36641: Harmonize parameter names Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168878 [details] [review] Bug 36641: Make tests cover all code paths Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168879 [details] [review] Bug 36641: (follow-up) Wrap in a try/catch block This patch adds the missing try/catch and unhandled exception error handler to the new list_effective_rules endpoint. Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168880 [details] [review] Bug 36641: (QA Follow-up) Fix variable name Created attachment 168881 [details] [review] Bug 36641: (follow-up) Update to allow returning non-effective rules This patch updates the existing /circulation_rules endpoint introduced in this patchset to allow return of all rule sets rather than only the effective set. We continue to default to the effective set for the parameters passed which will mean by default you will get an arrayref containing one hashref entry with each rule kind as a key in that hashref. However, if you add 'effective=false' as a query parameter, you will now have an arrayref of all rule sets that match your passed criteria including rules that may have fallen back to defaults in the effective case. WIP: Need to add support for * in branch, itemtype, patron category query parameters to allow explicit return of default rules vs no filter passed. (i.e. for the effective=false case where all rules for should be returned when no filters are passed vs * passed to filter to just default rules vs specifics passed for branch/item/patron filtering. Created attachment 168882 [details] [review] Bug 36641: Optionally filter to default rules using * Created attachment 168883 [details] [review] Bug 36641: Return '*' for 'default rule' Created attachment 168884 [details] [review] Bug 36641: Unit tests for effective=0 The scope here grew a bit as I tried to think about the future and how we might implement the Create, Update and Delete parts of the API. We continue to default to returning 'Effective' rule sets, however, I've now introduced an 'effective' query parameter which can be set to '0' to get back all branchcode, category, itemtype combination rule sets. The response differs slightly between effective and all responses.. both are now an arrayref of hashrefs but the effective rules only returns defined rules in the hash whereas the all response hashes will always contain all keys, defined or otherwise. Created attachment 168905 [details] [review] Bug 36641: Introduce render_invalid_parameter_value helper This patch introduces a new 'render_invalid_parameter_value' helper method that accepts 'path' and 'values' parameters to denote which field has failed validation and where the end user can get valid options. Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168906 [details] [review] Bug 36641: Add unit tests for /circulation_rules Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168907 [details] [review] Bug 36641: Add endpoint for fetching circulation rules This patch adds an endpoint for fetching ciruclations rules given the constraints of the passed parameters. We optionally expect item_type, library and patron_category as query parameters and we return a list of relevant circulation rules pertaining to that combination of requirements. You can also add a list of `rules` as a query parameter to limit the response to only the rules you are interested in for this combination. Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168908 [details] [review] Bug 36641: Harmonize parameter names Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168909 [details] [review] Bug 36641: Make tests cover all code paths Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168910 [details] [review] Bug 36641: (follow-up) Wrap in a try/catch block This patch adds the missing try/catch and unhandled exception error handler to the new list_effective_rules endpoint. Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168911 [details] [review] Bug 36641: (QA Follow-up) Fix variable name Created attachment 168912 [details] [review] Bug 36641: (follow-up) Update to allow returning non-effective rules This patch updates the existing /circulation_rules endpoint introduced in this patchset to allow return of all rule sets rather than only the effective set. We continue to default to the effective set for the parameters passed which will mean by default you will get an arrayref containing one hashref entry with each rule kind as a key in that hashref. However, if you add 'effective=false' as a query parameter, you will now have an arrayref of all rule sets that match your passed criteria including rules that may have fallen back to defaults in the effective case. WIP: Need to add support for * in branch, itemtype, patron category query parameters to allow explicit return of default rules vs no filter passed. (i.e. for the effective=false case where all rules for should be returned when no filters are passed vs * passed to filter to just default rules vs specifics passed for branch/item/patron filtering. Created attachment 168913 [details] [review] Bug 36641: Optionally filter to default rules using * Created attachment 168914 [details] [review] Bug 36641: Return '*' for 'default rule' Created attachment 168915 [details] [review] Bug 36641: Ensure we return all keys When using the effective route, we were missing some rule kinds if a rule hadn't yet been defined for them. We should instead return the rule as undefined. Created attachment 168916 [details] [review] Bug 36641: Unit tests for effective=0 Created attachment 168926 [details] [review] Bug 36641: Introduce render_invalid_parameter_value helper This patch introduces a new 'render_invalid_parameter_value' helper method that accepts 'path' and 'values' parameters to denote which field has failed validation and where the end user can get valid options. Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168927 [details] [review] Bug 36641: Add unit tests for /circulation_rules Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168928 [details] [review] Bug 36641: Add endpoint for fetching circulation rules This patch adds an endpoint for fetching ciruclations rules given the constraints of the passed parameters. We optionally expect item_type, library and patron_category as query parameters and we return a list of relevant circulation rules pertaining to that combination of requirements. You can also add a list of `rules` as a query parameter to limit the response to only the rules you are interested in for this combination. Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168929 [details] [review] Bug 36641: Harmonize parameter names Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168930 [details] [review] Bug 36641: Make tests cover all code paths Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168931 [details] [review] Bug 36641: (follow-up) Wrap in a try/catch block This patch adds the missing try/catch and unhandled exception error handler to the new list_effective_rules endpoint. Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 168932 [details] [review] Bug 36641: (QA Follow-up) Fix variable name Created attachment 168933 [details] [review] Bug 36641: (follow-up) Update to allow returning non-effective rules This patch updates the existing /circulation_rules endpoint introduced in this patchset to allow return of all rule sets rather than only the effective set. We continue to default to the effective set for the parameters passed which will mean by default you will get an arrayref containing one hashref entry with each rule kind as a key in that hashref. However, if you add 'effective=false' as a query parameter, you will now have an arrayref of all rule sets that match your passed criteria including rules that may have fallen back to defaults in the effective case. WIP: Need to add support for * in branch, itemtype, patron category query parameters to allow explicit return of default rules vs no filter passed. (i.e. for the effective=false case where all rules for should be returned when no filters are passed vs * passed to filter to just default rules vs specifics passed for branch/item/patron filtering. Created attachment 168934 [details] [review] Bug 36641: Optionally filter to default rules using * Created attachment 168935 [details] [review] Bug 36641: Return '*' for 'default rule' Created attachment 168936 [details] [review] Bug 36641: Ensure we return all keys When using the effective route, we were missing some rule kinds if a rule hadn't yet been defined for them. We should instead return the rule as undefined. Created attachment 168937 [details] [review] Bug 36641: Unit tests for effective=0 Created attachment 168938 [details] [review] Bug 36641: (follow-up) Ensure limited return works We have a ?rules=a,b parameter available for specifying a subset of rules in the set to return. This patch adds a test to confirm that works (and fixes the controller and specification as the test proved it wasn't working) Created attachment 168940 [details] [review] Bug 36641: (follow-up) Ensure limited return works We have a ?rules=a,b parameter available for specifying a subset of rules in the set to return. This patch adds a test to confirm that works (and fixes the controller and specification as the test proved it wasn't working) Created attachment 169013 [details] [review] Bug 36641: Introduce render_invalid_parameter_value helper This patch introduces a new 'render_invalid_parameter_value' helper method that accepts 'path' and 'values' parameters to denote which field has failed validation and where the end user can get valid options. Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 169014 [details] [review] Bug 36641: Add unit tests for /circulation_rules Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 169015 [details] [review] Bug 36641: Add endpoint for fetching circulation rules This patch adds an endpoint for fetching ciruclations rules given the constraints of the passed parameters. We optionally expect item_type, library and patron_category as query parameters and we return a list of relevant circulation rules pertaining to that combination of requirements. You can also add a list of `rules` as a query parameter to limit the response to only the rules you are interested in for this combination. Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 169016 [details] [review] Bug 36641: Harmonize parameter names Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 169017 [details] [review] Bug 36641: Make tests cover all code paths Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Created attachment 169018 [details] [review] Bug 36641: (follow-up) Wrap in a try/catch block This patch adds the missing try/catch and unhandled exception error handler to the new list_effective_rules endpoint. Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 169019 [details] [review] Bug 36641: (QA follow-up) Fix variable name Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 169020 [details] [review] Bug 36641: (follow-up) Update to allow returning non-effective rules This patch updates the existing /circulation_rules endpoint introduced in this patchset to allow return of all rule sets rather than only the effective set. We continue to default to the effective set for the parameters passed which will mean by default you will get an arrayref containing one hashref entry with each rule kind as a key in that hashref. However, if you add 'effective=false' as a query parameter, you will now have an arrayref of all rule sets that match your passed criteria including rules that may have fallen back to defaults in the effective case. WIP: Need to add support for * in branch, itemtype, patron category query parameters to allow explicit return of default rules vs no filter passed. (i.e. for the effective=false case where all rules for should be returned when no filters are passed vs * passed to filter to just default rules vs specifics passed for branch/item/patron filtering. Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 169021 [details] [review] Bug 36641: Optionally filter to default rules using * Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 169022 [details] [review] Bug 36641: Return '*' for 'default rule' Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 169023 [details] [review] Bug 36641: Ensure we return all keys When using the effective route, we were missing some rule kinds if a rule hadn't yet been defined for them. We should instead return the rule as undefined. Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 169024 [details] [review] Bug 36641: Unit tests for effective=0 Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 169025 [details] [review] Bug 36641: (follow-up) Ensure limited return works We have a ?rules=a,b parameter available for specifying a subset of rules in the set to return. This patch adds a test to confirm that works (and fixes the controller and specification as the test proved it wasn't working) Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Created attachment 169026 [details] [review] Bug 36641: Fix tests Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> [U+1F389] Thanks Tomas! Pushed for 24.11! Well done everyone, thank you! |