)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4b348f9668a546098749e4bd120ad93240d3e5ca","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6080d856_a82d2ab6","updated":"2025-06-17 16:34:36.000000000","message":"This is still not correct. Please look at my comment on patchset 1","commit_id":"1430497887697538704ed0f256e628e4fc71f9ff"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"342077f169893749d414a5551f50ede751d5fee3","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b279b685_fe7108f8","in_reply_to":"6080d856_a82d2ab6","updated":"2025-06-19 00:54:05.000000000","message":"Can you tell me what part I should look at?\n\nI added \n_query_mapping \u003d resource.QueryParameters(\n\"limit\",\n\"marker\",\n) to the attachment.py and tested it. Since I gave limit 1, it should return one result, but it returns two. Is there something I\u0027m missing?\n\npython-openstackclient/openstackclient/shell.py --os-cloud devstack volume attachment list --limit 1 \n+--------------------------------------+--------------------------------------+--------------------------------------+----------+\n| ID                                   | Volume ID                            | Server ID                            | Status   |\n+--------------------------------------+--------------------------------------+--------------------------------------+----------+\n| f52979d6-f107-40f1-9115-463209b5dcf8 | df626281-ef65-421d-90b8-5177c0ab7564 | 0f0d2e1a-2c0e-4cb3-993e-daf026722965 | attached |\n| 7122c7c8-7863-47e2-8cde-ab19d0b4b83d | 9d265a40-c5e4-4a1d-a49e-5b03e7a2620c | 2c0961bc-51a1-49f4-9737-b8aa74c4f3ee | attached |\n+--------------------------------------+--------------------------------------+--------------------------------------+----------+","commit_id":"1430497887697538704ed0f256e628e4fc71f9ff"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3cd200f2dac021d6b57a77687f5991a91d648b0c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"03bb11d1_5dd3ef1c","in_reply_to":"b279b685_fe7108f8","updated":"2025-06-19 10:52:44.000000000","message":"You addressed this in patchset 3 (PS3), however, per my other note, it seems the PS3 solution won\u0027t work. Let\u0027s focus the discussion there.","commit_id":"1430497887697538704ed0f256e628e4fc71f9ff"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7a93a0644365c0ae12e4e1da8727616d24ac7738","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"59801f24_14a20aa7","updated":"2025-06-18 12:52:13.000000000","message":"Apologies, I\u0027ve sent you down the slightly wrong track here. I said to investigate `_query_mapping`, which you did. However, I have remembered that by default we define a `limit` and `marker` query parameter, as you can see [here](https://github.com/openstack/openstacksdk/blob/41959b9912102c7aae1b4d4d9d8554db431919fb/openstack/resource.py#L262-L263), which should mean your change shouldn\u0027t be necessary. I therefore tried to reproduce your issue with the following script on `master` (i.e. without your fix):\n\n```\nimport openstack\nconn \u003d openstack.connect()\nprint(list(conn.block_storage.volumes(limit\u003d1)))\n```\n\nI see a full list of volumes returned so something is wrong. I then enabled debug logging and ran it again:\n\n```\nopenstack.enable_logging(debug\u003dFalse)\nprint(list(conn.block_storage.volumes(limit\u003d1)))\n```\n\nThis prints out loads of requests like so:\n\n```\nREQ: curl -g -i -X GET \"{host}/v3/c73b7097d07c46f78eb4b4dcfbac5ca8/volumes/detail?limit\u003d1\" -H \"Accept: application/json\" -H \"OpenStack-API-Version: volume 3.64\" -H \"User-Agent: openstacksdk/4.5.1 keystoneauth1/5.11.1 python-requests/2.32.3 CPython/3.13.3\" -H \"X-Auth-Token: {SHA256}582f31f32ee4dff630f08730c4c257adf84a71e7fd429e942bf12025170ed1c0\"\n...\nREQ: curl -g -i -X GET \"{host}/v3/c73b7097d07c46f78eb4b4dcfbac5ca8/volumes/detail?limit\u003d%5B%271%27%5D\u0026marker\u003d%5B%2764411\n16f-01e4-4198-8c35-6def95016883%27%5D\" -H \"Accept: application/json\" -H \"OpenStack-API-Version: volume 3.64\" -H \"User-Agent: openstacksdk/4.5.1 keystoneauth1/5.11.1 pyth\non-requests/2.32.3 CPython/3.13.3\" -H \"X-Auth-Token: {SHA256}582f31f32ee4dff630f08730c4c257adf84a71e7fd429e942bf12025170ed1c0\"\n...\nREQ: curl -g -i -X GET \"{host}/v3/c73b7097d07c46f78eb4b4dcfbac5ca8/volumes/detail?limit\u003d%5B%271%27%5D\u0026marker\u003d%5B%27e2b2e\n560-14ff-493d-8e79-d4904119b5c3%27%5D\" -H \"Accept: application/json\" -H \"OpenStack-API-Version: volume 3.64\" -H \"User-Agent: openstacksdk/4.5.1 keystoneauth1/5.11.1 pyth\non-requests/2.32.3 CPython/3.13.3\" -H \"X-Auth-Token: {SHA256}582f31f32ee4dff630f08730c4c257adf84a71e7fd429e942bf12025170ed1c0\"\n...\n```\n\nThis looks like a bug in either (a) the pagination code in the `Resource` class or (b) the Cinder code. You are going to need to debug this to figure out what\u0027s happening. This likely won\u0027t be an easy fix but it should be interesting and you will learn a lot. I would start by reading the `list` and `_get_next_link` methods of the `Resource` class in `openstack/resource.py` and then sticking in a lot of `print` statements or logs so that you can see what is happening. If you are able to figure out the issue, please let us know. If it is an issue with `openstacksdk`, please fix it and add a test to prove your fix works (the test should fail without your fix and pass with it). If it is an issue with Cinder, we can report and fix it there and add a workaround to openstacksdk to handle older versions of Cinder without the fix.\n\nI hope this helps!","commit_id":"fb9d9f1554ca3132fbab3c78a7590dd6b78d65ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8092b105f86443495686cd6d3599a32874a0ce55","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"74c3bc43_3edd9de7","in_reply_to":"222da54f_880044c2","updated":"2025-06-19 11:08:47.000000000","message":"Actually, someone just suggested that we could use `itertools.islice` here. That will return N entries and make as few requests as possible. For example:\n\n```\nimport itertools\nimport openstack\nconn \u003d openstack.connect()\nopenstack.enable_logging(debug\u003dFalse)\nlist(itertools.islice(conn.block_storage.volumes(limit\u003d1), 1))\n```\n\nThere are two ways to fix this. Firstly, we could do this entirely in openstackclient. If we took this approach, we should examine all places that use the `--limit` command (hint: we generally add these options with the `add_marker_pagination_option_to_parser` helper) and replace calls like e.g.\n\n```\ndata \u003d list(compute_client.servers(**search_opts))\n```\n\nwith\n\n```\ndata \u003d list(\n    itertools.islice(compute_client.servers(**search_opts), search_opts.get(\u0027limit\u0027)\n)\n```\n\nAlternatively, we could fix this in openstacksdk by wrapping the call to `resource_type.list` in `openstack.proxy.Proxy` as above.\n\nThe former would avoid changing the behavior of SDK while fixing the bug in openstackclient but it will be a lot more work. The latter would be a lot simpler, but would need a good release note to document what has changed.","commit_id":"fb9d9f1554ca3132fbab3c78a7590dd6b78d65ae"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"d2b3f1a1ec61f8adab2002c56ccafb90968f750e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"97adae48_db0d07e9","in_reply_to":"4e31a0a4_4d141c00","updated":"2025-06-19 12:27:01.000000000","message":"I like using itertools.islice() in Proxy class. \n\nApart from this, what is meant by providing interface like rust SDK?","commit_id":"fb9d9f1554ca3132fbab3c78a7590dd6b78d65ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"264611e212e32c5de978a1d7b633209ad76881ac","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"bc59b941_51b4981b","in_reply_to":"59801f24_14a20aa7","updated":"2025-06-18 16:41:07.000000000","message":"As an additional bit of context, I tested the below against a local devstack:\n\n```\n❯ curl -g -X GET -H \"X-Auth-Token: {token}\" http://10.0.110.168/volume/v3/volumes?limit\u003d1 | jq\n{\n  \"volumes\": [\n    {\n      \"id\": \"b359d832-ec5d-45c9-bc6a-605d7069e06a\",\n      \"name\": \"baz\",\n      \"links\": [\n        {\n          \"rel\": \"self\",\n          \"href\": \"http://10.0.110.168/volume/v3/volumes/b359d832-ec5d-45c9-bc6a-605d7069e06a\"\n        },\n        {\n          \"rel\": \"bookmark\",\n          \"href\": \"http://10.0.110.168/volume/volumes/b359d832-ec5d-45c9-bc6a-605d7069e06a\"\n        }\n      ]\n    }\n  ],\n  \"volumes_links\": [\n    {\n      \"rel\": \"next\",\n      \"href\": \"http://10.0.110.168/volume/v3/volumes?limit\u003d1\u0026marker\u003db359d832-ec5d-45c9-bc6a-605d7069e06a\"\n    }\n  ]\n}\n```\n\nI initially thought that the `volumes_links` field was wrong and that we shouldn\u0027t be returning a link of `rel` type `next`. However, the [cinder api-ref](https://docs.openstack.org/api-ref/block-storage/v3/#volumes-volumes) indicates that this property is used to control the page size. There\u0027s nothing to say you shouldn\u0027t retrieve multiple pages.\n\nThis definitely sounds like something we want to fix in SDK, not Cinder.","commit_id":"fb9d9f1554ca3132fbab3c78a7590dd6b78d65ae"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"f5efdcbdae4fde278b3f0405148d6b3f81078a74","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"4e31a0a4_4d141c00","in_reply_to":"5dcb5ecd_a26f7940","updated":"2025-06-19 11:57:45.000000000","message":"`\n Could you check to see if there is a bug open for the --limit option and, \nif not, please open one and link to it from here? 🙏\n`\n\nI tested it and there is a bug.\n\n--os-cloud devstack volume attachment list --limit 1 \n+--------------------------------------+--------------------------------------+--------------------------------------+----------+\n| ID                                   | Volume ID                            | Server ID                            | Status   |\n+--------------------------------------+--------------------------------------+--------------------------------------+----------+\n| f52979d6-f107-40f1-9115-463209b5dcf8 | df626281-ef65-421d-90b8-5177c0ab7564 | 0f0d2e1a-2c0e-4cb3-993e-daf026722965 | attached |\n| 7122c7c8-7863-47e2-8cde-ab19d0b4b83d | 9d265a40-c5e4-4a1d-a49e-5b03e7a2620c | 2c0961bc-51a1-49f4-9737-b8aa74c4f3ee | attached |\n+--------------------------------------+--------------------------------------+--------------------------------------+----------+","commit_id":"fb9d9f1554ca3132fbab3c78a7590dd6b78d65ae"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"5d34ded740d6d6c202d2e60d76c116cb1a32638d","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"5dcb5ecd_a26f7940","in_reply_to":"74c3bc43_3edd9de7","updated":"2025-06-19 11:16:59.000000000","message":"the behavior that we inherited from the past (and what I am sure some are relying on) is to use limit as page size UNLESS the market is also specified, which is when it becomes a hard limit. Changing anything here is a pretty big breaking change which will cause lot of angry voices.\nSDK should behave like it is treating limit as API key and doing pagination. A not paginating interface may be added though like it is done in the rust SDK where client is explicitly choosing to use pagination or not.\nWe also definitely should not change the behavior only in one place.","commit_id":"fb9d9f1554ca3132fbab3c78a7590dd6b78d65ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d3b4a43add0c831245bae9face7f5aa4b009ba94","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"7a6d2d96_3bd37166","in_reply_to":"97adae48_db0d07e9","updated":"2025-07-18 11:41:35.000000000","message":"I think this thread can be closed. By rust SDK, gtema was referring to this change https://review.opendev.org/c/openstack/codegenerator/+/952998","commit_id":"fb9d9f1554ca3132fbab3c78a7590dd6b78d65ae"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"342077f169893749d414a5551f50ede751d5fee3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"eeb11793_230c8c05","in_reply_to":"bc59b941_51b4981b","updated":"2025-06-19 00:54:05.000000000","message":"Thanks to you, I found out what the problem was.\n\nIt seems like the resource class is working in a way that it gets the next resource based on the link.\n\nWhen I think about it, when applying paging,\n\nThe _get_next_link method should compare the number of currently fetched resources with the limit and return the next resource address, but that part seems to be missing.","commit_id":"fb9d9f1554ca3132fbab3c78a7590dd6b78d65ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3cd200f2dac021d6b57a77687f5991a91d648b0c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"222da54f_880044c2","in_reply_to":"eeb11793_230c8c05","updated":"2025-06-19 10:52:44.000000000","message":"Yes, exactly. However, I discussed this with @artem.goncharov@gmail.com and this is not easy. `limit` can mean two things: either the size of a page when doing pagination or the maximum number of resources to return. openstacksdk is using the former meaning, while openstackclient is using the latter.\n\nI don\u0027t know if we can or should change the behavior of openstacksdk to match the former. I think it could be better to add a new parameter, `max_items`, to the `Resource.list` class method and to feed this through to `Resource._get_next_link`. That way we can keep the two separate. What do you think?\n\nAlso, just a heads up: the bug you have linked describes a separate issue. https://bugs.launchpad.net/python-openstackclient/+bug/2083327 says that we should remove references to the `--filters` option since it doesn\u0027t exist (or implement that command). Could you check to see if there is a bug open for the `--limit` option and, if not, please open one and link to it from here? 🙏","commit_id":"fb9d9f1554ca3132fbab3c78a7590dd6b78d65ae"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0f948c8ec0ad879a5d6862c4f079d82d023e5df0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"044697da_40323261","updated":"2025-06-23 22:25:12.000000000","message":"This is getting close. Can you add a release note and address my comments inline, please?","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"53395ea491584b1b6b7d8e469123ba129fa45024","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"007494db_9036af70","in_reply_to":"044697da_40323261","updated":"2025-06-24 04:30:51.000000000","message":"Sure, but can you help me add release notes?\nI\u0027ve never done it before.","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f01ddde6512c25fde886f95984915803c5434948","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"eca1f4f2_e8318a3d","updated":"2025-07-18 11:39:46.000000000","message":"I think this can be much simpler. I\u0027m going to push a revision to show what I mean, rather than have a lot of back-and-forth on this. Please take a look and let me know what you think. If you agree, and if it works for your purposes, could you please add a release note and some tests?","commit_id":"7f327212279363dab7d54b2dcfcf52d480024490"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"aa5ab8c346f1acf67e75bf7b2f1f0482b9fa7ef9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"d5bb2870_313a6b2e","updated":"2025-07-02 12:04:11.000000000","message":"RECHECK","commit_id":"7f327212279363dab7d54b2dcfcf52d480024490"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5abe51805fd95294dcb4b2a55e2976405577416b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"5aaca0a5_2ab94f9e","updated":"2025-07-24 11:40:25.000000000","message":"This is almost there. Thank you for your persistence on this! 🙏","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c0ec7df640281765143f7791b8fe09c9f41297dd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"f575031b_6ed198d3","updated":"2025-07-29 16:16:04.000000000","message":"Great work 😊","commit_id":"d649aada8d5f72af3537b8c413adc05da1706b53"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0e1a4afc2bcc582be133278c64ef961fa5c1114b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"9cb1dea6_26da5234","updated":"2025-07-29 16:15:55.000000000","message":"🎉","commit_id":"d649aada8d5f72af3537b8c413adc05da1706b53"}],"openstack/block_storage/v3/_proxy.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c5bbcfbb689ccefe32dc8597c8bbc075a73c4e35","unresolved":true,"context_lines":[{"line_number":1246,"context_line":"        \"\"\""},{"line_number":1247,"context_line":"        return islice("},{"line_number":1248,"context_line":"            self._list(_attachment.Attachment, **query), query.get(\u0027limit\u0027)"},{"line_number":1249,"context_line":"        )"},{"line_number":1250,"context_line":""},{"line_number":1251,"context_line":"    def delete_attachment(self, attachment, ignore_missing\u003dTrue):"},{"line_number":1252,"context_line":"        \"\"\"Delete an attachment"}],"source_content_type":"text/x-python","patch_set":1,"id":"b38a9522_2a9c0b70","line":1249,"updated":"2025-06-09 15:47:09.000000000","message":"This isn\u0027t how you want to do this since it won\u0027t affect the remote fetch. Instead, look at the `_query_mapping` attribute defined on the `Resource` class.","commit_id":"ff003385b5b09612a08f3fc057558412b9b82006"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"342077f169893749d414a5551f50ede751d5fee3","unresolved":false,"context_lines":[{"line_number":1246,"context_line":"        \"\"\""},{"line_number":1247,"context_line":"        return islice("},{"line_number":1248,"context_line":"            self._list(_attachment.Attachment, **query), query.get(\u0027limit\u0027)"},{"line_number":1249,"context_line":"        )"},{"line_number":1250,"context_line":""},{"line_number":1251,"context_line":"    def delete_attachment(self, attachment, ignore_missing\u003dTrue):"},{"line_number":1252,"context_line":"        \"\"\"Delete an attachment"}],"source_content_type":"text/x-python","patch_set":1,"id":"671e3fe2_edd9cd7a","line":1249,"in_reply_to":"b38a9522_2a9c0b70","updated":"2025-06-19 00:54:05.000000000","message":"Thank you!\n\nI modified it to stop the iteration \nif the resources size is equal to the limit.","commit_id":"ff003385b5b09612a08f3fc057558412b9b82006"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0f948c8ec0ad879a5d6862c4f079d82d023e5df0","unresolved":true,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import typing as ty"},{"line_number":15,"context_line":"import warnings"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"492eb333_4b0819ed","line":13,"updated":"2025-06-23 22:25:12.000000000","message":"Can you remove this?","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"53395ea491584b1b6b7d8e469123ba129fa45024","unresolved":true,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import typing as ty"},{"line_number":15,"context_line":"import warnings"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"d4565421_00c3764a","line":13,"in_reply_to":"492eb333_4b0819ed","updated":"2025-06-24 04:30:51.000000000","message":"ty, warnings be used to service, snapshot method. remove it?","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"837a2162b59919dc15e8c3273355330f7ad6ca2a","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import typing as ty"},{"line_number":15,"context_line":"import warnings"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"400bdbac_9bd29c11","line":13,"in_reply_to":"8e0022fb_13b5a26d","updated":"2025-06-30 16:51:30.000000000","message":"Done","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"51ac403819cf909b739228c8ec828d57e49c6872","unresolved":true,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"import typing as ty"},{"line_number":15,"context_line":"import warnings"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"8e0022fb_13b5a26d","line":13,"in_reply_to":"d4565421_00c3764a","updated":"2025-06-30 16:01:30.000000000","message":"No, I mean the additional newline that was added here. It\u0027s not needed.","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"}],"openstack/block_storage/v3/attachment.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0f948c8ec0ad879a5d6862c4f079d82d023e5df0","unresolved":true,"context_lines":[{"line_number":22,"context_line":"    resources_key \u003d \"attachments\""},{"line_number":23,"context_line":"    base_path \u003d \"/attachments\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    _query_mapping \u003d resource.QueryParameters("},{"line_number":26,"context_line":"        \"limit\","},{"line_number":27,"context_line":"        \"marker\","},{"line_number":28,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":4,"id":"ed683814_c60f5d26","line":25,"updated":"2025-06-23 22:25:12.000000000","message":"You don\u0027t need this now. It\u0027s default for the `Resource` class\n\nhttps://github.com/openstack/openstacksdk/blob/41959b9912102c7aae1b4d4d9d8554db431919fb/openstack/resource.py#L389\nhttps://github.com/openstack/openstacksdk/blob/41959b9912102c7aae1b4d4d9d8554db431919fb/openstack/resource.py#L262-L263","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"837a2162b59919dc15e8c3273355330f7ad6ca2a","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    resources_key \u003d \"attachments\""},{"line_number":23,"context_line":"    base_path \u003d \"/attachments\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    _query_mapping \u003d resource.QueryParameters("},{"line_number":26,"context_line":"        \"limit\","},{"line_number":27,"context_line":"        \"marker\","},{"line_number":28,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":4,"id":"cca79c6d_400cf30e","line":25,"in_reply_to":"d88c5893_0758ad05","updated":"2025-06-30 16:51:30.000000000","message":"Done","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"53395ea491584b1b6b7d8e469123ba129fa45024","unresolved":true,"context_lines":[{"line_number":22,"context_line":"    resources_key \u003d \"attachments\""},{"line_number":23,"context_line":"    base_path \u003d \"/attachments\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    _query_mapping \u003d resource.QueryParameters("},{"line_number":26,"context_line":"        \"limit\","},{"line_number":27,"context_line":"        \"marker\","},{"line_number":28,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":4,"id":"d88c5893_0758ad05","line":25,"in_reply_to":"ed683814_c60f5d26","updated":"2025-06-24 04:30:51.000000000","message":"Thank you. I\u0027ll remove it","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"}],"openstack/dns/v2/_base.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5abe51805fd95294dcb4b2a55e2976405577416b","unresolved":true,"context_lines":[{"line_number":94,"context_line":"    @classmethod"},{"line_number":95,"context_line":"    def _get_next_link("},{"line_number":96,"context_line":"        cls, uri, response, data, marker, limit, total_yielded, max_items"},{"line_number":97,"context_line":"    ):"},{"line_number":98,"context_line":"        next_link \u003d None"},{"line_number":99,"context_line":"        params: dict[str, list[str] | str] \u003d {}"},{"line_number":100,"context_line":"        if isinstance(data, dict):"}],"source_content_type":"text/x-python","patch_set":11,"id":"ccb90732_8f48289a","line":97,"updated":"2025-07-24 11:40:25.000000000","message":"I don\u0027t think you need these changes (see `resource.py` comments)","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"f610f6282808b9b1754177c0ae52080066011a3f","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    @classmethod"},{"line_number":95,"context_line":"    def _get_next_link("},{"line_number":96,"context_line":"        cls, uri, response, data, marker, limit, total_yielded, max_items"},{"line_number":97,"context_line":"    ):"},{"line_number":98,"context_line":"        next_link \u003d None"},{"line_number":99,"context_line":"        params: dict[str, list[str] | str] \u003d {}"},{"line_number":100,"context_line":"        if isinstance(data, dict):"}],"source_content_type":"text/x-python","patch_set":11,"id":"0ce25ed9_fd976052","line":97,"in_reply_to":"ccb90732_8f48289a","updated":"2025-07-24 14:06:08.000000000","message":"Done","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"}],"openstack/proxy.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d789cf291ff6dcbe024f14c930553ccdb72e9e96","unresolved":true,"context_lines":[{"line_number":892,"context_line":"            )"},{"line_number":893,"context_line":"            return jmespath.search(jmespath_filters, data)  # type: ignore[no-any-return]"},{"line_number":894,"context_line":""},{"line_number":895,"context_line":"        return (x for x in itertools.islice(data, attrs.get(\u0027limit\u0027)))"},{"line_number":896,"context_line":""},{"line_number":897,"context_line":"    def _head("},{"line_number":898,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":4,"id":"6e4f5de9_55bac1e6","line":895,"range":{"start_line":895,"start_character":9,"end_line":895,"end_character":70},"updated":"2025-06-23 11:10:43.000000000","message":"You should be able to return the generator as-is, no?\n\n```suggestion\n        return itertools.islice(data, attrs.get(\u0027limit\u0027))\n```","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"bf858e657934222856f54371510b6013b4b1609c","unresolved":true,"context_lines":[{"line_number":892,"context_line":"            )"},{"line_number":893,"context_line":"            return jmespath.search(jmespath_filters, data)  # type: ignore[no-any-return]"},{"line_number":894,"context_line":""},{"line_number":895,"context_line":"        return (x for x in itertools.islice(data, attrs.get(\u0027limit\u0027)))"},{"line_number":896,"context_line":""},{"line_number":897,"context_line":"    def _head("},{"line_number":898,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":4,"id":"cc8402d1_5b4ef27a","line":895,"range":{"start_line":895,"start_character":9,"end_line":895,"end_character":70},"in_reply_to":"6e4f5de9_55bac1e6","updated":"2025-06-23 11:30:08.000000000","message":"When I wrote return itertools.islice(data, attrs.get(\u0027limit\u0027)) and ran the test,\nI got the following error\n\n`openstack/proxy.py: note: In member \"_list\" of class \"Proxy\":\nopenstack/proxy.py:894:16: error: Incompatible return value type (got \"islice[resource.ResourceT]\", expected \"Generator[resource.ResourceT, None, None]\")  [return-value]`","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"53395ea491584b1b6b7d8e469123ba129fa45024","unresolved":false,"context_lines":[{"line_number":892,"context_line":"            )"},{"line_number":893,"context_line":"            return jmespath.search(jmespath_filters, data)  # type: ignore[no-any-return]"},{"line_number":894,"context_line":""},{"line_number":895,"context_line":"        return (x for x in itertools.islice(data, attrs.get(\u0027limit\u0027)))"},{"line_number":896,"context_line":""},{"line_number":897,"context_line":"    def _head("},{"line_number":898,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5c8f5199_617593d2","line":895,"range":{"start_line":895,"start_character":9,"end_line":895,"end_character":70},"in_reply_to":"b75605e8_db392821","updated":"2025-06-24 04:30:51.000000000","message":"Yes, it is good.","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0f948c8ec0ad879a5d6862c4f079d82d023e5df0","unresolved":false,"context_lines":[{"line_number":892,"context_line":"            )"},{"line_number":893,"context_line":"            return jmespath.search(jmespath_filters, data)  # type: ignore[no-any-return]"},{"line_number":894,"context_line":""},{"line_number":895,"context_line":"        return (x for x in itertools.islice(data, attrs.get(\u0027limit\u0027)))"},{"line_number":896,"context_line":""},{"line_number":897,"context_line":"    def _head("},{"line_number":898,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":4,"id":"b75605e8_db392821","line":895,"range":{"start_line":895,"start_character":9,"end_line":895,"end_character":70},"in_reply_to":"cc8402d1_5b4ef27a","updated":"2025-06-23 22:25:12.000000000","message":"Ack. Can you put a comment here explaining what we\u0027re doing in that case?","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8befd8722cc1b26759787a5c16f527d64a324131","unresolved":true,"context_lines":[{"line_number":895,"context_line":"        # In order to apply a limit in the Resource class, there are many things to fix,"},{"line_number":896,"context_line":"        # and the code related to the limit must behave the same,"},{"line_number":897,"context_line":"        # so here we return a resource of the limit size."},{"line_number":898,"context_line":"        return (x for x in itertools.islice(data, attrs.get(\u0027limit\u0027)))"},{"line_number":899,"context_line":""},{"line_number":900,"context_line":"    def _head("},{"line_number":901,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":6,"id":"0657adf2_b56cd076","line":898,"updated":"2025-06-30 16:44:24.000000000","message":"I\u0027ve been thinking more about this. I\u0027m sorry, but I think we should introduce a new argument to this method and to `Resource.list` instead. We can call the option `max_items`, since that doesn\u0027t seem to be reserved as a query string parameter for any API that I\u0027m aware of. If you do this, you will also need a release note and you should update the commit message. We will need a separate change for python-openstackclient client but that should be trivial.","commit_id":"c577ed8990695d4584ffa180593df5ad35f485b4"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"837a2162b59919dc15e8c3273355330f7ad6ca2a","unresolved":true,"context_lines":[{"line_number":895,"context_line":"        # In order to apply a limit in the Resource class, there are many things to fix,"},{"line_number":896,"context_line":"        # and the code related to the limit must behave the same,"},{"line_number":897,"context_line":"        # so here we return a resource of the limit size."},{"line_number":898,"context_line":"        return (x for x in itertools.islice(data, attrs.get(\u0027limit\u0027)))"},{"line_number":899,"context_line":""},{"line_number":900,"context_line":"    def _head("},{"line_number":901,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":6,"id":"48756fd2_38b020e1","line":898,"in_reply_to":"0657adf2_b56cd076","updated":"2025-06-30 16:51:30.000000000","message":"Yes, fine, I\u0027ll do it.","commit_id":"c577ed8990695d4584ffa180593df5ad35f485b4"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d3b4a43add0c831245bae9face7f5aa4b009ba94","unresolved":false,"context_lines":[{"line_number":895,"context_line":"        # In order to apply a limit in the Resource class, there are many things to fix,"},{"line_number":896,"context_line":"        # and the code related to the limit must behave the same,"},{"line_number":897,"context_line":"        # so here we return a resource of the limit size."},{"line_number":898,"context_line":"        return (x for x in itertools.islice(data, attrs.get(\u0027limit\u0027)))"},{"line_number":899,"context_line":""},{"line_number":900,"context_line":"    def _head("},{"line_number":901,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":6,"id":"084882fd_3144c0b8","line":898,"in_reply_to":"48756fd2_38b020e1","updated":"2025-07-18 11:41:35.000000000","message":"Done","commit_id":"c577ed8990695d4584ffa180593df5ad35f485b4"}],"openstack/resource.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f01ddde6512c25fde886f95984915803c5434948","unresolved":true,"context_lines":[{"line_number":264,"context_line":"                {"},{"line_number":265,"context_line":"                    \"limit\": \"limit\","},{"line_number":266,"context_line":"                    \"marker\": \"marker\","},{"line_number":267,"context_line":"                    \"max_items\": \"max_items\","},{"line_number":268,"context_line":"                }"},{"line_number":269,"context_line":"            )"},{"line_number":270,"context_line":"        self._mapping.update({name: name for name in names})"}],"source_content_type":"text/x-python","patch_set":7,"id":"be8f7a94_7d796c8d","line":267,"updated":"2025-07-18 11:39:46.000000000","message":"I think this is overcomplicated: we shouldn\u0027t pretend that this is a querystring parameter when it is obviously not. Instead, we should just have a new parameter on the `list` method.","commit_id":"7f327212279363dab7d54b2dcfcf52d480024490"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"88287a1aa753456671634b36de379b80b38f2c3a","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                {"},{"line_number":265,"context_line":"                    \"limit\": \"limit\","},{"line_number":266,"context_line":"                    \"marker\": \"marker\","},{"line_number":267,"context_line":"                    \"max_items\": \"max_items\","},{"line_number":268,"context_line":"                }"},{"line_number":269,"context_line":"            )"},{"line_number":270,"context_line":"        self._mapping.update({name: name for name in names})"}],"source_content_type":"text/x-python","patch_set":7,"id":"6e4b1161_dc2765b9","line":267,"in_reply_to":"be8f7a94_7d796c8d","updated":"2025-07-18 11:40:02.000000000","message":"Done","commit_id":"7f327212279363dab7d54b2dcfcf52d480024490"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f01ddde6512c25fde886f95984915803c5434948","unresolved":true,"context_lines":[{"line_number":1961,"context_line":"        allow_unknown_params: bool \u003d False,"},{"line_number":1962,"context_line":"        *,"},{"line_number":1963,"context_line":"        microversion: str | None \u003d None,"},{"line_number":1964,"context_line":"        headers: dict[str, str] | None \u003d None,"},{"line_number":1965,"context_line":"        **params: ty.Any,"},{"line_number":1966,"context_line":"    ) -\u003e ty.Generator[ty_ext.Self, None, None]:"},{"line_number":1967,"context_line":"        \"\"\"This method is a generator which yields resource objects."}],"source_content_type":"text/x-python","patch_set":7,"id":"37025980_c726484f","line":1964,"updated":"2025-07-18 11:39:46.000000000","message":"here\n\n```suggestion\n        headers: dict[str, str] | None \u003d None,\n        max_items: int | None \u003d None,\n```","commit_id":"7f327212279363dab7d54b2dcfcf52d480024490"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"88287a1aa753456671634b36de379b80b38f2c3a","unresolved":false,"context_lines":[{"line_number":1961,"context_line":"        allow_unknown_params: bool \u003d False,"},{"line_number":1962,"context_line":"        *,"},{"line_number":1963,"context_line":"        microversion: str | None \u003d None,"},{"line_number":1964,"context_line":"        headers: dict[str, str] | None \u003d None,"},{"line_number":1965,"context_line":"        **params: ty.Any,"},{"line_number":1966,"context_line":"    ) -\u003e ty.Generator[ty_ext.Self, None, None]:"},{"line_number":1967,"context_line":"        \"\"\"This method is a generator which yields resource objects."}],"source_content_type":"text/x-python","patch_set":7,"id":"966f2af1_ec87f345","line":1964,"in_reply_to":"37025980_c726484f","updated":"2025-07-18 11:40:02.000000000","message":"Done","commit_id":"7f327212279363dab7d54b2dcfcf52d480024490"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f01ddde6512c25fde886f95984915803c5434948","unresolved":true,"context_lines":[{"line_number":2061,"context_line":"        # Track the total number of resources yielded so we can paginate"},{"line_number":2062,"context_line":"        # swift objects"},{"line_number":2063,"context_line":"        total_yielded \u003d 0"},{"line_number":2064,"context_line":"        while uri:"},{"line_number":2065,"context_line":"            # Copy query_params due to weird mock unittest interactions"},{"line_number":2066,"context_line":"            query_params_copy \u003d query_params.copy()"},{"line_number":2067,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82277f_aebd5cfd","line":2064,"updated":"2025-07-18 11:39:46.000000000","message":"```suggestion\n        while uri:\n            if max_items and max_items \u003e\u003d total_yielded:\n                return\n\n```","commit_id":"7f327212279363dab7d54b2dcfcf52d480024490"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"88287a1aa753456671634b36de379b80b38f2c3a","unresolved":false,"context_lines":[{"line_number":2061,"context_line":"        # Track the total number of resources yielded so we can paginate"},{"line_number":2062,"context_line":"        # swift objects"},{"line_number":2063,"context_line":"        total_yielded \u003d 0"},{"line_number":2064,"context_line":"        while uri:"},{"line_number":2065,"context_line":"            # Copy query_params due to weird mock unittest interactions"},{"line_number":2066,"context_line":"            query_params_copy \u003d query_params.copy()"},{"line_number":2067,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a9bdc7d_bc68fb7f","line":2064,"in_reply_to":"ff82277f_aebd5cfd","updated":"2025-07-18 11:40:02.000000000","message":"Done","commit_id":"7f327212279363dab7d54b2dcfcf52d480024490"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f01ddde6512c25fde886f95984915803c5434948","unresolved":true,"context_lines":[{"line_number":2227,"context_line":"            params[\u0027limit\u0027] \u003d limit"},{"line_number":2228,"context_line":""},{"line_number":2229,"context_line":"        if max_items and max_items \u003c\u003d total_yielded:"},{"line_number":2230,"context_line":"            return None, params"},{"line_number":2231,"context_line":""},{"line_number":2232,"context_line":"        return next_link, params"},{"line_number":2233,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"37f94472_ce9e377b","line":2230,"updated":"2025-07-18 11:39:46.000000000","message":"Rather than doing this here, why not doing it above in the `list` method? You have already generated the URL at this point, so it seems wasteful to error out now.","commit_id":"7f327212279363dab7d54b2dcfcf52d480024490"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"88287a1aa753456671634b36de379b80b38f2c3a","unresolved":false,"context_lines":[{"line_number":2227,"context_line":"            params[\u0027limit\u0027] \u003d limit"},{"line_number":2228,"context_line":""},{"line_number":2229,"context_line":"        if max_items and max_items \u003c\u003d total_yielded:"},{"line_number":2230,"context_line":"            return None, params"},{"line_number":2231,"context_line":""},{"line_number":2232,"context_line":"        return next_link, params"},{"line_number":2233,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"54a33dc2_29168901","line":2230,"in_reply_to":"37f94472_ce9e377b","updated":"2025-07-18 11:40:02.000000000","message":"Done","commit_id":"7f327212279363dab7d54b2dcfcf52d480024490"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5abe51805fd95294dcb4b2a55e2976405577416b","unresolved":true,"context_lines":[{"line_number":2096,"context_line":"                # We return as soon as we hit our limit, even if we have items"},{"line_number":2097,"context_line":"                # remaining"},{"line_number":2098,"context_line":"                if max_items and total_yielded \u003e\u003d max_items:"},{"line_number":2099,"context_line":"                    return"},{"line_number":2100,"context_line":"                # Do not allow keys called \"self\" through. Glance chose"},{"line_number":2101,"context_line":"                # to name a key \"self\", so we need to pop it out because"},{"line_number":2102,"context_line":"                # we can\u0027t send it through cls.existing and into the"}],"source_content_type":"text/x-python","patch_set":11,"id":"e34944b7_92e044c9","line":2099,"updated":"2025-07-24 11:40:25.000000000","message":"nit: can you add a newline after this to visually separate things?","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"f610f6282808b9b1754177c0ae52080066011a3f","unresolved":false,"context_lines":[{"line_number":2096,"context_line":"                # We return as soon as we hit our limit, even if we have items"},{"line_number":2097,"context_line":"                # remaining"},{"line_number":2098,"context_line":"                if max_items and total_yielded \u003e\u003d max_items:"},{"line_number":2099,"context_line":"                    return"},{"line_number":2100,"context_line":"                # Do not allow keys called \"self\" through. Glance chose"},{"line_number":2101,"context_line":"                # to name a key \"self\", so we need to pop it out because"},{"line_number":2102,"context_line":"                # we can\u0027t send it through cls.existing and into the"}],"source_content_type":"text/x-python","patch_set":11,"id":"5516da89_d7acf21e","line":2099,"in_reply_to":"e34944b7_92e044c9","updated":"2025-07-24 14:06:08.000000000","message":"Done","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5abe51805fd95294dcb4b2a55e2976405577416b","unresolved":true,"context_lines":[{"line_number":2134,"context_line":""},{"line_number":2135,"context_line":"            if resources and paginated:"},{"line_number":2136,"context_line":"                uri, next_params \u003d cls._get_next_link("},{"line_number":2137,"context_line":"                    uri,"},{"line_number":2138,"context_line":"                    response,"},{"line_number":2139,"context_line":"                    data,"},{"line_number":2140,"context_line":"                    marker,"},{"line_number":2141,"context_line":"                    limit,"},{"line_number":2142,"context_line":"                    total_yielded,"},{"line_number":2143,"context_line":"                    max_items,"},{"line_number":2144,"context_line":"                )"},{"line_number":2145,"context_line":"                try:"},{"line_number":2146,"context_line":"                    if next_params[\u0027marker\u0027] \u003d\u003d last_marker:"}],"source_content_type":"text/x-python","patch_set":11,"id":"f2ff82e9_9f27901d","line":2143,"range":{"start_line":2137,"start_character":0,"end_line":2143,"end_character":30},"updated":"2025-07-24 11:40:25.000000000","message":"Per my comment below.\n\n```suggestion\n                    uri, response, data, marker, limit, total_yielded\n```","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"f610f6282808b9b1754177c0ae52080066011a3f","unresolved":false,"context_lines":[{"line_number":2134,"context_line":""},{"line_number":2135,"context_line":"            if resources and paginated:"},{"line_number":2136,"context_line":"                uri, next_params \u003d cls._get_next_link("},{"line_number":2137,"context_line":"                    uri,"},{"line_number":2138,"context_line":"                    response,"},{"line_number":2139,"context_line":"                    data,"},{"line_number":2140,"context_line":"                    marker,"},{"line_number":2141,"context_line":"                    limit,"},{"line_number":2142,"context_line":"                    total_yielded,"},{"line_number":2143,"context_line":"                    max_items,"},{"line_number":2144,"context_line":"                )"},{"line_number":2145,"context_line":"                try:"},{"line_number":2146,"context_line":"                    if next_params[\u0027marker\u0027] \u003d\u003d last_marker:"}],"source_content_type":"text/x-python","patch_set":11,"id":"0334f658_c52d6eeb","line":2143,"range":{"start_line":2137,"start_character":0,"end_line":2143,"end_character":30},"in_reply_to":"f2ff82e9_9f27901d","updated":"2025-07-24 14:06:08.000000000","message":"Done","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5abe51805fd95294dcb4b2a55e2976405577416b","unresolved":true,"context_lines":[{"line_number":2159,"context_line":""},{"line_number":2160,"context_line":"    @classmethod"},{"line_number":2161,"context_line":"    def _get_next_link("},{"line_number":2162,"context_line":"        cls, uri, response, data, marker, limit, total_yielded, max_items"},{"line_number":2163,"context_line":"    ):"},{"line_number":2164,"context_line":"        next_link \u003d None"},{"line_number":2165,"context_line":"        params: dict[str, str | list[str] | int] \u003d {}"}],"source_content_type":"text/x-python","patch_set":11,"id":"a02de7ec_6162c0ed","line":2162,"updated":"2025-07-24 11:40:25.000000000","message":"We\u0027re not using this parameter. Can we drop it?","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"f610f6282808b9b1754177c0ae52080066011a3f","unresolved":false,"context_lines":[{"line_number":2159,"context_line":""},{"line_number":2160,"context_line":"    @classmethod"},{"line_number":2161,"context_line":"    def _get_next_link("},{"line_number":2162,"context_line":"        cls, uri, response, data, marker, limit, total_yielded, max_items"},{"line_number":2163,"context_line":"    ):"},{"line_number":2164,"context_line":"        next_link \u003d None"},{"line_number":2165,"context_line":"        params: dict[str, str | list[str] | int] \u003d {}"}],"source_content_type":"text/x-python","patch_set":11,"id":"59b86c8e_41457634","line":2162,"in_reply_to":"a02de7ec_6162c0ed","updated":"2025-07-24 14:06:08.000000000","message":"Done","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5abe51805fd95294dcb4b2a55e2976405577416b","unresolved":true,"context_lines":[{"line_number":2224,"context_line":"            next_link \u003d uri"},{"line_number":2225,"context_line":"            params[\u0027marker\u0027] \u003d marker"},{"line_number":2226,"context_line":"            params[\u0027limit\u0027] \u003d limit"},{"line_number":2227,"context_line":"        return next_link, params"},{"line_number":2228,"context_line":""},{"line_number":2229,"context_line":"    @classmethod"},{"line_number":2230,"context_line":"    def _get_one_match(cls, name_or_id, results):"}],"source_content_type":"text/x-python","patch_set":11,"id":"4078bf54_65d029d2","line":2227,"updated":"2025-07-24 11:40:25.000000000","message":"Can you re-add this line?\n\n```suggestion\n\n        return next_link, params\n```","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"f610f6282808b9b1754177c0ae52080066011a3f","unresolved":false,"context_lines":[{"line_number":2224,"context_line":"            next_link \u003d uri"},{"line_number":2225,"context_line":"            params[\u0027marker\u0027] \u003d marker"},{"line_number":2226,"context_line":"            params[\u0027limit\u0027] \u003d limit"},{"line_number":2227,"context_line":"        return next_link, params"},{"line_number":2228,"context_line":""},{"line_number":2229,"context_line":"    @classmethod"},{"line_number":2230,"context_line":"    def _get_one_match(cls, name_or_id, results):"}],"source_content_type":"text/x-python","patch_set":11,"id":"815fc482_b42dddb6","line":2227,"in_reply_to":"4078bf54_65d029d2","updated":"2025-07-24 14:06:08.000000000","message":"Done","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"}],"openstack/tests/unit/dns/v2/test_zone_transfer.py":[{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"81e82adc86a11d338d1e0363025e5756e2d53b45","unresolved":true,"context_lines":[{"line_number":85,"context_line":"        self.assertFalse(sot.allow_delete)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        self.assertDictEqual("},{"line_number":88,"context_line":"            {"},{"line_number":89,"context_line":"                \u0027limit\u0027: \u0027limit\u0027,"},{"line_number":90,"context_line":"                \u0027marker\u0027: \u0027marker\u0027,"},{"line_number":91,"context_line":"                \u0027status\u0027: \u0027status\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"e5fd2554_023dd051","line":88,"updated":"2025-07-23 14:17:43.000000000","message":"I modified it before, \nbut I don\u0027t know why it\u0027s not reflected.","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"f610f6282808b9b1754177c0ae52080066011a3f","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self.assertFalse(sot.allow_delete)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        self.assertDictEqual("},{"line_number":88,"context_line":"            {"},{"line_number":89,"context_line":"                \u0027limit\u0027: \u0027limit\u0027,"},{"line_number":90,"context_line":"                \u0027marker\u0027: \u0027marker\u0027,"},{"line_number":91,"context_line":"                \u0027status\u0027: \u0027status\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"6ea4a7fe_90ab2a61","line":88,"in_reply_to":"53bae596_ea269004","updated":"2025-07-24 14:06:08.000000000","message":"Done","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5abe51805fd95294dcb4b2a55e2976405577416b","unresolved":true,"context_lines":[{"line_number":85,"context_line":"        self.assertFalse(sot.allow_delete)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        self.assertDictEqual("},{"line_number":88,"context_line":"            {"},{"line_number":89,"context_line":"                \u0027limit\u0027: \u0027limit\u0027,"},{"line_number":90,"context_line":"                \u0027marker\u0027: \u0027marker\u0027,"},{"line_number":91,"context_line":"                \u0027status\u0027: \u0027status\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"53bae596_ea269004","line":88,"in_reply_to":"e5fd2554_023dd051","updated":"2025-07-24 11:40:25.000000000","message":"This is happening because you added a trailing comma, which is causing ruff to reformat the file. I would suggest checking out the previous state of the file:\n\n```\ngit checkout -f HEAD~ openstack/tests/unit/dns/v2/test_zone_transfer.py\n```\n\nThis will restore the file to what it looked like at `HEAD~` (i.e. the commit before this one).","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"}],"openstack/tests/unit/test_proxy.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0f948c8ec0ad879a5d6862c4f079d82d023e5df0","unresolved":true,"context_lines":[{"line_number":465,"context_line":"            **self.args,"},{"line_number":466,"context_line":"        )"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"        self.assertEqual(self.fake_response, list(rv))"},{"line_number":469,"context_line":"        ListableResource.list.assert_called_once_with("},{"line_number":470,"context_line":"            self.sot, paginated\u003dpaginated, base_path\u003dbase_path, **self.args"},{"line_number":471,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":4,"id":"b78c549a_d867dfeb","line":468,"updated":"2025-06-23 22:25:12.000000000","message":"Is this needed? If so, why wasn\u0027t it needed before?","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"51ac403819cf909b739228c8ec828d57e49c6872","unresolved":false,"context_lines":[{"line_number":465,"context_line":"            **self.args,"},{"line_number":466,"context_line":"        )"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"        self.assertEqual(self.fake_response, list(rv))"},{"line_number":469,"context_line":"        ListableResource.list.assert_called_once_with("},{"line_number":470,"context_line":"            self.sot, paginated\u003dpaginated, base_path\u003dbase_path, **self.args"},{"line_number":471,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":4,"id":"b59a4289_0437868b","line":468,"in_reply_to":"b454af15_1a57f27c","updated":"2025-06-30 16:01:30.000000000","message":"Ah, I see the issue: `ListableResource` isn\u0027t a real resource and our mock is of the wrong type (it\u0027s returning a list not a generator. This makes sense so.","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"53395ea491584b1b6b7d8e469123ba129fa45024","unresolved":true,"context_lines":[{"line_number":465,"context_line":"            **self.args,"},{"line_number":466,"context_line":"        )"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"        self.assertEqual(self.fake_response, list(rv))"},{"line_number":469,"context_line":"        ListableResource.list.assert_called_once_with("},{"line_number":470,"context_line":"            self.sot, paginated\u003dpaginated, base_path\u003dbase_path, **self.args"},{"line_number":471,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":4,"id":"b454af15_1a57f27c","line":468,"in_reply_to":"b78c549a_d867dfeb","updated":"2025-06-24 04:30:51.000000000","message":"Applying islice slightly breaks test code.\n\nIf i don\u0027t apply list(), the test will fail \nbecause it will compare the actual objects.\n\n`testtools.matchers._impl.MismatchError: !\u003d:\nreference \u003d [openstack.resource.Resource()]\nactual    \u003d \u003cgenerator object Proxy._list.\u003clocals\u003e.\u003cgenexpr\u003e at 0x7f00a02afdc0\u003e`","commit_id":"ed5809ad417acd853d6e8f9940fb0c658b397224"}],"openstack/tests/unit/test_resource.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0f948c8ec0ad879a5d6862c4f079d82d023e5df0","unresolved":true,"context_lines":[{"line_number":2812,"context_line":"        self.session.get.side_effect \u003d [resp1, resp2]"},{"line_number":2813,"context_line":""},{"line_number":2814,"context_line":"        results \u003d self.sot.list(self.session, limit\u003d2, paginated\u003dTrue)"},{"line_number":2815,"context_line":""},{"line_number":2816,"context_line":"        # Get the first page\u0027s two items"},{"line_number":2817,"context_line":"        result0 \u003d next(results)"},{"line_number":2818,"context_line":"        self.assertEqual(result0.id, ids[0])"}],"source_content_type":"text/x-python","patch_set":4,"id":"3e4cc9c1_4dc4cec4","side":"PARENT","line":2815,"updated":"2025-06-23 22:25:12.000000000","message":"Can you remove this?","commit_id":"41959b9912102c7aae1b4d4d9d8554db431919fb"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"53395ea491584b1b6b7d8e469123ba129fa45024","unresolved":true,"context_lines":[{"line_number":2812,"context_line":"        self.session.get.side_effect \u003d [resp1, resp2]"},{"line_number":2813,"context_line":""},{"line_number":2814,"context_line":"        results \u003d self.sot.list(self.session, limit\u003d2, paginated\u003dTrue)"},{"line_number":2815,"context_line":""},{"line_number":2816,"context_line":"        # Get the first page\u0027s two items"},{"line_number":2817,"context_line":"        result0 \u003d next(results)"},{"line_number":2818,"context_line":"        self.assertEqual(result0.id, ids[0])"}],"source_content_type":"text/x-python","patch_set":4,"id":"bde53bfd_001f146d","side":"PARENT","line":2815,"in_reply_to":"3e4cc9c1_4dc4cec4","updated":"2025-06-24 04:30:51.000000000","message":"It seems like the test code is connected to result2. \nIf I comment out that code, the test case below will fail.","commit_id":"41959b9912102c7aae1b4d4d9d8554db431919fb"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"51ac403819cf909b739228c8ec828d57e49c6872","unresolved":true,"context_lines":[{"line_number":2812,"context_line":"        self.session.get.side_effect \u003d [resp1, resp2]"},{"line_number":2813,"context_line":""},{"line_number":2814,"context_line":"        results \u003d self.sot.list(self.session, limit\u003d2, paginated\u003dTrue)"},{"line_number":2815,"context_line":""},{"line_number":2816,"context_line":"        # Get the first page\u0027s two items"},{"line_number":2817,"context_line":"        result0 \u003d next(results)"},{"line_number":2818,"context_line":"        self.assertEqual(result0.id, ids[0])"}],"source_content_type":"text/x-python","patch_set":4,"id":"dd7937d1_21452696","side":"PARENT","line":2815,"in_reply_to":"bde53bfd_001f146d","updated":"2025-06-30 16:01:30.000000000","message":"Sorry, again I mean the extra newline.","commit_id":"41959b9912102c7aae1b4d4d9d8554db431919fb"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"837a2162b59919dc15e8c3273355330f7ad6ca2a","unresolved":false,"context_lines":[{"line_number":2812,"context_line":"        self.session.get.side_effect \u003d [resp1, resp2]"},{"line_number":2813,"context_line":""},{"line_number":2814,"context_line":"        results \u003d self.sot.list(self.session, limit\u003d2, paginated\u003dTrue)"},{"line_number":2815,"context_line":""},{"line_number":2816,"context_line":"        # Get the first page\u0027s two items"},{"line_number":2817,"context_line":"        result0 \u003d next(results)"},{"line_number":2818,"context_line":"        self.assertEqual(result0.id, ids[0])"}],"source_content_type":"text/x-python","patch_set":4,"id":"f6857dfb_58855d80","side":"PARENT","line":2815,"in_reply_to":"dd7937d1_21452696","updated":"2025-06-30 16:51:30.000000000","message":"Done","commit_id":"41959b9912102c7aae1b4d4d9d8554db431919fb"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5abe51805fd95294dcb4b2a55e2976405577416b","unresolved":true,"context_lines":[{"line_number":2313,"context_line":"        self.assertEqual(2, len(self.session.get.call_args_list))"},{"line_number":2314,"context_line":"        self.assertIsInstance(results[0], Test)"},{"line_number":2315,"context_line":""},{"line_number":2316,"context_line":"    def test_list_response_paginated_with_max_items(self):"},{"line_number":2317,"context_line":"        \"\"\"Test pagination with a \u0027max_items\u0027 in the response."},{"line_number":2318,"context_line":""},{"line_number":2319,"context_line":"        The limit variable is used in two meanings."}],"source_content_type":"text/x-python","patch_set":11,"id":"9cd24f1f_68e43478","line":2316,"updated":"2025-07-24 11:40:25.000000000","message":"Thanks. This is good, but we are missing two test cases:\n\n- `max_items` is set and `limit` in unset (so `limit` defaults to `max_items`)\n- both `max_items` and `limit` are set, and `max_items` is greater than `limit` (the opposite of this test: we should see multiple requests for `limit` resources each time)\n\nCould you add these?","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"f610f6282808b9b1754177c0ae52080066011a3f","unresolved":false,"context_lines":[{"line_number":2313,"context_line":"        self.assertEqual(2, len(self.session.get.call_args_list))"},{"line_number":2314,"context_line":"        self.assertIsInstance(results[0], Test)"},{"line_number":2315,"context_line":""},{"line_number":2316,"context_line":"    def test_list_response_paginated_with_max_items(self):"},{"line_number":2317,"context_line":"        \"\"\"Test pagination with a \u0027max_items\u0027 in the response."},{"line_number":2318,"context_line":""},{"line_number":2319,"context_line":"        The limit variable is used in two meanings."}],"source_content_type":"text/x-python","patch_set":11,"id":"e13f2004_00b6c446","line":2316,"in_reply_to":"9cd24f1f_68e43478","updated":"2025-07-24 14:06:08.000000000","message":"Done","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"}],"releasenotes/notes/add_max_item_parameter-3ab3c2e1cd2312c5.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5abe51805fd95294dcb4b2a55e2976405577416b","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The limit used in the Resource is used with two meanings,"},{"line_number":5,"context_line":"    so max items, which means the number of resources returned, was added to use them separately."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"d84e5e00_7d504b7e","line":5,"range":{"start_line":4,"start_character":0,"end_line":5,"end_character":97},"updated":"2025-07-24 11:40:25.000000000","message":"How about:\n\n```suggestion\n    A new parameter, ``max_items``, is added to the ``Resource.list``\n    method. This allows users to specify the maximum number of resources\n    that should be returned to the user, as opposed to the maximum number\n    of items that should be requested from the server in a single request.\n    The latter is already handled by the ``limit`` parameter.\n```","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"},{"author":{"_account_id":37959,"name":"djp","display_name":"dimsssss","email":"dimsss0607@gmail.com","username":"dimsssss"},"change_message_id":"f610f6282808b9b1754177c0ae52080066011a3f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The limit used in the Resource is used with two meanings,"},{"line_number":5,"context_line":"    so max items, which means the number of resources returned, was added to use them separately."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"fbe1a924_afdeb9d2","line":5,"range":{"start_line":4,"start_character":0,"end_line":5,"end_character":97},"in_reply_to":"d84e5e00_7d504b7e","updated":"2025-07-24 14:06:08.000000000","message":"Done","commit_id":"2f4ffc82e2fe1a1c45a6d325a76b0a7112fcc19a"}]}
