René's URL Explorer Experiment


Title: Add support for operation functions by negz · Pull Request #164 · crossplane/function-sdk-python · GitHub

Open Graph Title: Add support for operation functions by negz · Pull Request #164 · crossplane/function-sdk-python

X Title: Add support for operation functions by negz · Pull Request #164 · crossplane/function-sdk-python

Description: Description of your changes Fixes #162 This PR adds helpers to the Python SDK to make writing operation functions easier. Operation functions use the same FunctionRunnerService RPC as composition functions. The new request.py module provides functions to get required resources (previously called "extra resources" in composition functions) and includes a helper specifically for accessing watched resources in WatchOperations. The response.py module gets new functions to set operation output and build resource requirements I have: Read and followed Crossplane's contribution process. Added or updated unit tests for my change.

Open Graph Description: Description of your changes Fixes #162 This PR adds helpers to the Python SDK to make writing operation functions easier. Operation functions use the same FunctionRunnerService RPC as composition ...

X Description: Description of your changes Fixes #162 This PR adds helpers to the Python SDK to make writing operation functions easier. Operation functions use the same FunctionRunnerService RPC as composition ...

Opengraph URL: https://github.com/crossplane/function-sdk-python/pull/164

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:fcc9427e-b5f4-fa31-2d70-dd9740513b9f
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-id83BC:223AE4:11C5649:19CF8AA:6A633862
html-safe-noncecf9904bd074f11e9b9281b39340def4aded218acb3690ccb2443befcbc119671
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4M0JDOjIyM0FFNDoxMUM1NjQ5OjE5Q0Y4QUE6NkE2MzM4NjIiLCJ2aXNpdG9yX2lkIjoiNDE0NDg4MjY4ODE2NzI2MTE0IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0=
visitor-hmac5b7759819226ea8296c8a80ea9bc0a46eb98a055d64123a0559692a17769c632
hovercard-subject-tagpull_request:2678523347
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/crossplane/function-sdk-python/pull/164/files
twitter:imagehttps://avatars.githubusercontent.com/u/1049349?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/1049349?s=400&v=4
og:image:altDescription of your changes Fixes #162 This PR adds helpers to the Python SDK to make writing operation functions easier. Operation functions use the same FunctionRunnerService RPC as composition ...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
None59e55daad7174ca59d63c6974d58276ccb5477442e550bebb3c035e1bef11c94
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/crossplane/function-sdk-python git https://github.com/crossplane/function-sdk-python.git
octolytics-dimension-user_id45158470
octolytics-dimension-user_logincrossplane
octolytics-dimension-repository_id721365259
octolytics-dimension-repository_nwocrossplane/function-sdk-python
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id721365259
octolytics-dimension-repository_network_root_nwocrossplane/function-sdk-python
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release990295d92a4cc7b63fbbd83a046217cd7d77d49c
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/crossplane/function-sdk-python/pull/164/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fcrossplane%2Ffunction-sdk-python%2Fpull%2F164%2Ffiles
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
Code QualityEnforce quality at mergehttps://github.com/features/code-quality
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fcrossplane%2Ffunction-sdk-python%2Fpull%2F164%2Ffiles
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=crossplane%2Ffunction-sdk-python
Reloadhttps://github.com/crossplane/function-sdk-python/pull/164/files
Reloadhttps://github.com/crossplane/function-sdk-python/pull/164/files
Reloadhttps://github.com/crossplane/function-sdk-python/pull/164/files
Please reload this pagehttps://github.com/crossplane/function-sdk-python/pull/164/files
crossplane https://github.com/crossplane
function-sdk-pythonhttps://github.com/crossplane/function-sdk-python
Notifications https://github.com/login?return_to=%2Fcrossplane%2Ffunction-sdk-python
Fork 14 https://github.com/login?return_to=%2Fcrossplane%2Ffunction-sdk-python
Star 13 https://github.com/login?return_to=%2Fcrossplane%2Ffunction-sdk-python
Code https://github.com/crossplane/function-sdk-python
Issues 6 https://github.com/crossplane/function-sdk-python/issues
Pull requests 1 https://github.com/crossplane/function-sdk-python/pulls
Actions https://github.com/crossplane/function-sdk-python/actions
Projects https://github.com/crossplane/function-sdk-python/projects
Security and quality 0 https://github.com/crossplane/function-sdk-python/security
Insights https://github.com/crossplane/function-sdk-python/pulse
Code https://github.com/crossplane/function-sdk-python
Issues https://github.com/crossplane/function-sdk-python/issues
Pull requests https://github.com/crossplane/function-sdk-python/pulls
Actions https://github.com/crossplane/function-sdk-python/actions
Projects https://github.com/crossplane/function-sdk-python/projects
Security and quality https://github.com/crossplane/function-sdk-python/security
Insights https://github.com/crossplane/function-sdk-python/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fcrossplane%2Ffunction-sdk-python%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fcrossplane%2Ffunction-sdk-python%2Fissues%2Fnew%2Fchoose
negzhttps://github.com/negz
crossplane:mainhttps://github.com/crossplane/function-sdk-python/tree/main
negz:operationalhttps://github.com/negz/function-sdk-python/tree/operational
Conversation 1 https://github.com/crossplane/function-sdk-python/pull/164
Commits 4 https://github.com/crossplane/function-sdk-python/pull/164/commits
Checks 6 https://github.com/crossplane/function-sdk-python/pull/164/checks
Files changed https://github.com/crossplane/function-sdk-python/pull/164/files
Please reload this pagehttps://github.com/crossplane/function-sdk-python/pull/164/files
Add support for operation functions https://github.com/crossplane/function-sdk-python/pull/164/files#top
Show all changes 4 commits https://github.com/crossplane/function-sdk-python/pull/164/files
0551df7 Add operation protos from c/c negz Jul 19, 2025 https://github.com/crossplane/function-sdk-python/pull/164/commits/0551df7922b83763012b076ff69f3196596c91ce
12be880 Add support for operation functions negz Jul 19, 2025 https://github.com/crossplane/function-sdk-python/pull/164/commits/12be880f52a092e1ea5780daed01c5387c106c14
711fad0 Keep extra_resources support at the proto level negz Aug 5, 2025 https://github.com/crossplane/function-sdk-python/pull/164/commits/711fad09d9945816cf8076ebbf3abd460f9b4e43
3fd547c Use deterministic JSON ordering in tests negz Aug 5, 2025 https://github.com/crossplane/function-sdk-python/pull/164/commits/3fd547c27577b3a2621b62e47ef414270a5bae8f
Clear filters https://github.com/crossplane/function-sdk-python/pull/164/files
Please reload this pagehttps://github.com/crossplane/function-sdk-python/pull/164/files
Please reload this pagehttps://github.com/crossplane/function-sdk-python/pull/164/files
.gitignore https://github.com/crossplane/function-sdk-python/pull/164/files#diff-bc37d034bad564583790a46f19d807abfe519c5671395fd494d8cce506c42947
run_function.proto https://github.com/crossplane/function-sdk-python/pull/164/files#diff-98a0522c436a6b1cd78753725c6fdbaa515acc1675a80637e40261c2e0533bff
run_function_pb2.py https://github.com/crossplane/function-sdk-python/pull/164/files#diff-e9cfbbbacdae20a0c9dead31b7884158a6ce6007d4ffb18d30094f3b3afadf35
run_function_pb2.pyi https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a8401094b89793445f55f10fbc3787063283582f7faa1cd7b86cb33498bd4913
run_function_pb2_grpc.py https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a963dd86754966240c7f5e365fd6082a11c7e72140c0a7281b357b5e72953a5f
run_function.proto https://github.com/crossplane/function-sdk-python/pull/164/files#diff-bae332c8810049239ce4e8edb49813ec191d9038c0d9f67b1d983932d89ec42f
run_function_pb2.py https://github.com/crossplane/function-sdk-python/pull/164/files#diff-26fffa95f5561c38fa69bd70e6bd70e8c1cddce86bcdaa49b5c045c6ab986e1c
run_function_pb2.pyi https://github.com/crossplane/function-sdk-python/pull/164/files#diff-407311d09565f1625fa923f62b9f034428a3a41567d759ec8d45946359ecee63
run_function_pb2_grpc.py https://github.com/crossplane/function-sdk-python/pull/164/files#diff-5d18ed14279404d3dd591ee2db016cb5bb552305db3f4058552461a5634da2e4
request.py https://github.com/crossplane/function-sdk-python/pull/164/files#diff-151f24273c3dc69c99d9810ed68d5a3fecf3e9e680c144d080d3386aeb9b383a
response.py https://github.com/crossplane/function-sdk-python/pull/164/files#diff-6ca8bf10f865ead26c7dc8840f03fb68886744c7dbd268ca70d45e8f3c0ae4db
test_request.py https://github.com/crossplane/function-sdk-python/pull/164/files#diff-bd349e6112b08d91d6b451b7a9ed0c4983a75624ffe177cc78a4221663838bf6
test_response.py https://github.com/crossplane/function-sdk-python/pull/164/files#diff-5ce09014418e00d448be3dc28b7aa0e35e9f30503930c48dacfba0bf99fa0fa2
https://github.com/crossplane/function-sdk-python/blob/main/CODEOWNERS#L22
.gitignorehttps://github.com/crossplane/function-sdk-python/pull/164/files#diff-bc37d034bad564583790a46f19d807abfe519c5671395fd494d8cce506c42947
View file https://github.com/negz/function-sdk-python/blob/3fd547c27577b3a2621b62e47ef414270a5bae8f/.gitignore
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/crossplane/function-sdk-python/pull/164/{{ revealButtonHref }}
https://github.com/crossplane/function-sdk-python/pull/164/files#diff-bc37d034bad564583790a46f19d807abfe519c5671395fd494d8cce506c42947
https://github.com/crossplane/function-sdk-python/blob/main/CODEOWNERS#L22
crossplane/function/proto/v1/run_function.protohttps://github.com/crossplane/function-sdk-python/pull/164/files#diff-98a0522c436a6b1cd78753725c6fdbaa515acc1675a80637e40261c2e0533bff
View file https://github.com/negz/function-sdk-python/blob/3fd547c27577b3a2621b62e47ef414270a5bae8f/crossplane/function/proto/v1/run_function.proto
Open in desktop https://desktop.github.com
Please reload this pagehttps://github.com/crossplane/function-sdk-python/pull/164/files
https://github.com/crossplane/function-sdk-python/blob/main/CODEOWNERS#L22
crossplane/function/proto/v1/run_function_pb2.pyhttps://github.com/crossplane/function-sdk-python/pull/164/files#diff-e9cfbbbacdae20a0c9dead31b7884158a6ce6007d4ffb18d30094f3b3afadf35
View file https://github.com/negz/function-sdk-python/blob/3fd547c27577b3a2621b62e47ef414270a5bae8f/crossplane/function/proto/v1/run_function_pb2.py
Open in desktop https://desktop.github.com
Please reload this pagehttps://github.com/crossplane/function-sdk-python/pull/164/files
https://github.com/crossplane/function-sdk-python/blob/main/CODEOWNERS#L22
crossplane/function/proto/v1/run_function_pb2.pyihttps://github.com/crossplane/function-sdk-python/pull/164/files#diff-a8401094b89793445f55f10fbc3787063283582f7faa1cd7b86cb33498bd4913
View file https://github.com/negz/function-sdk-python/blob/3fd547c27577b3a2621b62e47ef414270a5bae8f/crossplane/function/proto/v1/run_function_pb2.pyi
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/crossplane/function-sdk-python/pull/164/{{ revealButtonHref }}
https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a8401094b89793445f55f10fbc3787063283582f7faa1cd7b86cb33498bd4913
https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a8401094b89793445f55f10fbc3787063283582f7faa1cd7b86cb33498bd4913
https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a8401094b89793445f55f10fbc3787063283582f7faa1cd7b86cb33498bd4913
https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a8401094b89793445f55f10fbc3787063283582f7faa1cd7b86cb33498bd4913
https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a8401094b89793445f55f10fbc3787063283582f7faa1cd7b86cb33498bd4913
https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a8401094b89793445f55f10fbc3787063283582f7faa1cd7b86cb33498bd4913
https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a8401094b89793445f55f10fbc3787063283582f7faa1cd7b86cb33498bd4913
https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a8401094b89793445f55f10fbc3787063283582f7faa1cd7b86cb33498bd4913
https://github.com/crossplane/function-sdk-python/blob/main/CODEOWNERS#L22
crossplane/function/proto/v1/run_function_pb2_grpc.pyhttps://github.com/crossplane/function-sdk-python/pull/164/files#diff-a963dd86754966240c7f5e365fd6082a11c7e72140c0a7281b357b5e72953a5f
View file https://github.com/negz/function-sdk-python/blob/3fd547c27577b3a2621b62e47ef414270a5bae8f/crossplane/function/proto/v1/run_function_pb2_grpc.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/crossplane/function-sdk-python/pull/164/{{ revealButtonHref }}
https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a963dd86754966240c7f5e365fd6082a11c7e72140c0a7281b357b5e72953a5f
https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a963dd86754966240c7f5e365fd6082a11c7e72140c0a7281b357b5e72953a5f
https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a963dd86754966240c7f5e365fd6082a11c7e72140c0a7281b357b5e72953a5f
https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a963dd86754966240c7f5e365fd6082a11c7e72140c0a7281b357b5e72953a5f
https://github.com/crossplane/function-sdk-python/pull/164/files#diff-a963dd86754966240c7f5e365fd6082a11c7e72140c0a7281b357b5e72953a5f
Please reload this pagehttps://github.com/crossplane/function-sdk-python/pull/164/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.