Skip to content

Commit 1e57d3b

Browse files
release: 1.13.0 (#61)
* chore(internal): change ci workflow machines * fix: avoid newer type syntax * chore(internal): update pyright exclude list * feat(api): api update * feat(api): api update * feat(api): api update * chore(internal): add Sequence related utils * feat(types): replace List[str] with SequenceNotStr in params * feat(api): api update * feat(api): api update * feat(api): api update * feat: improve future compat with pydantic v3 * chore(internal): move mypy configurations to `pyproject.toml` file * feat(api): api update * feat(api): api update * chore(tests): simplify `get_platform` test `nest_asyncio` is archived and broken on some platforms so it's not worth keeping in our test suite. * feat(api): api update * chore(internal): update pydantic dependency * chore(types): change optional parameter type from NotGiven to Omit * chore: do not install brew dependencies in ./scripts/bootstrap by default * codegen metadata * feat(api): set idempotency key header by default * chore: improve example values * feat(api): api update * fix(compat): compat with `pydantic<2.8.0` when using additional fields * release: 1.13.0 --------- Co-authored-by: stainless-app[bot] <142633134+stainless-app[bot]@users.noreply.github.com>
1 parent 6996244 commit 1e57d3b

File tree

105 files changed

+2927
-1376
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+2927
-1376
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ jobs:
4242
permissions:
4343
contents: read
4444
id-token: write
45-
runs-on: depot-ubuntu-24.04
45+
runs-on: ${{ github.repository == 'stainless-sdks/knock-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
4646
steps:
4747
- uses: actions/checkout@v4
4848

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "1.12.1"
2+
".": "1.13.0"
33
}

.stats.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 89
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/knock%2Fknock-e4ea1ded040ebfa923df0d24ef37ae3c742383828cda85e1489bc2cb5e14da29.yml
3-
openapi_spec_hash: 4cfd1f5f0d42e1b821f70ba12089b606
4-
config_hash: 5c872aa99cad9b9602e84668f5b38a8a
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/knock%2Fknock-9971ba6348f3ffc2a607ebe5655b9df917916150ca0ba85de53c162a07e689b1.yml
3+
openapi_spec_hash: 71828f7634a08410d2d1eb2ee6ead90a
4+
config_hash: 9dc38647849223e579325a016fc5eeb4

CHANGELOG.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,44 @@
11
# Changelog
22

3+
## 1.13.0 (2025-09-24)
4+
5+
Full Changelog: [v1.12.1...v1.13.0](https://github.com/knocklabs/knock-python/compare/v1.12.1...v1.13.0)
6+
7+
### Features
8+
9+
* **api:** api update ([d7b6c47](https://github.com/knocklabs/knock-python/commit/d7b6c474cb8edcc4cfe34d9cd4e98523365a716b))
10+
* **api:** api update ([35e2b49](https://github.com/knocklabs/knock-python/commit/35e2b4952d2a49e991c44c8051fd2a882a98ff9a))
11+
* **api:** api update ([1cdaf26](https://github.com/knocklabs/knock-python/commit/1cdaf26e8af57ab84654b48b30fd54afc5c721ac))
12+
* **api:** api update ([78563fd](https://github.com/knocklabs/knock-python/commit/78563fd72a7c20144d49770a2fb1d444cfa96d83))
13+
* **api:** api update ([c2a6ebb](https://github.com/knocklabs/knock-python/commit/c2a6ebbc4de4158cabbc9a22f60c2cee346c3531))
14+
* **api:** api update ([122f574](https://github.com/knocklabs/knock-python/commit/122f574b1018dededf82d02d01f56d055115ce40))
15+
* **api:** api update ([b6b52d7](https://github.com/knocklabs/knock-python/commit/b6b52d7259d8c48f92f208d99756eb7fd234b0c4))
16+
* **api:** api update ([da8cdc0](https://github.com/knocklabs/knock-python/commit/da8cdc052fe12a158e2f3e8081182fa0cada65f0))
17+
* **api:** api update ([df20d51](https://github.com/knocklabs/knock-python/commit/df20d5158a8a0df0600147be6497c56feed1a257))
18+
* **api:** api update ([b9007c9](https://github.com/knocklabs/knock-python/commit/b9007c9da8d172eeb43c0acb509ec12c7c3d0d9a))
19+
* **api:** set idempotency key header by default ([9d22a7c](https://github.com/knocklabs/knock-python/commit/9d22a7ccd5ca33775cd60d1d2c6cc1b883d906ae))
20+
* improve future compat with pydantic v3 ([125d0c3](https://github.com/knocklabs/knock-python/commit/125d0c3e2d2cbfaaee8b8c2460b9328fa7f1a47a))
21+
* **types:** replace List[str] with SequenceNotStr in params ([e19113c](https://github.com/knocklabs/knock-python/commit/e19113cded8eccae475f30b36ae5585427bffe57))
22+
23+
24+
### Bug Fixes
25+
26+
* avoid newer type syntax ([66ba143](https://github.com/knocklabs/knock-python/commit/66ba143f5c6e28cb7e04c0682f1da3dbe0a82f55))
27+
* **compat:** compat with `pydantic&lt;2.8.0` when using additional fields ([c6ad6a9](https://github.com/knocklabs/knock-python/commit/c6ad6a98989bcb6b4ec6982ba7dc1303c5b832ec))
28+
29+
30+
### Chores
31+
32+
* do not install brew dependencies in ./scripts/bootstrap by default ([4c552a6](https://github.com/knocklabs/knock-python/commit/4c552a66eaaa4a0d51a1d78819c3c9623e4a31b3))
33+
* improve example values ([48505ea](https://github.com/knocklabs/knock-python/commit/48505eadad03840bdfe6b073fb4f059e3d05a9e8))
34+
* **internal:** add Sequence related utils ([2032a76](https://github.com/knocklabs/knock-python/commit/2032a76fac21550c5198347c3f5a392e86616ca4))
35+
* **internal:** change ci workflow machines ([a1760f4](https://github.com/knocklabs/knock-python/commit/a1760f41b2ca681bf983ae3b24c49516156fa7bd))
36+
* **internal:** move mypy configurations to `pyproject.toml` file ([c9193ff](https://github.com/knocklabs/knock-python/commit/c9193ff2a63d7b83981dea86f0b7cfa11542c4cd))
37+
* **internal:** update pydantic dependency ([0636d0b](https://github.com/knocklabs/knock-python/commit/0636d0bbc0f0b4e9559de931f93dc8e6217ad963))
38+
* **internal:** update pyright exclude list ([40513b5](https://github.com/knocklabs/knock-python/commit/40513b513e482356c3abf8c4427e133da91f8a85))
39+
* **tests:** simplify `get_platform` test ([e6d99e5](https://github.com/knocklabs/knock-python/commit/e6d99e582689202e25a841d02d225d72c9d5ca0b))
40+
* **types:** change optional parameter type from NotGiven to Omit ([4a81616](https://github.com/knocklabs/knock-python/commit/4a81616dd316193b7e078076bde0ca530fade27d))
41+
342
## 1.12.1 (2025-08-21)
443

544
Full Changelog: [v1.12.0...v1.12.1](https://github.com/knocklabs/knock-python/compare/v1.12.0...v1.12.1)

api.md

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,15 @@ from knockapi.types import (
6262
IdentifyUserRequest,
6363
InlineIdentifyUserRequest,
6464
User,
65-
UserDeleteResponse,
6665
UserListPreferencesResponse,
67-
UserUnsetChannelDataResponse,
6866
)
6967
```
7068

7169
Methods:
7270

7371
- <code title="put /v1/users/{user_id}">client.users.<a href="./src/knockapi/resources/users/users.py">update</a>(user_id, \*\*<a href="src/knockapi/types/user_update_params.py">params</a>) -> <a href="./src/knockapi/types/user.py">User</a></code>
7472
- <code title="get /v1/users">client.users.<a href="./src/knockapi/resources/users/users.py">list</a>(\*\*<a href="src/knockapi/types/user_list_params.py">params</a>) -> <a href="./src/knockapi/types/user.py">SyncEntriesCursor[User]</a></code>
75-
- <code title="delete /v1/users/{user_id}">client.users.<a href="./src/knockapi/resources/users/users.py">delete</a>(user_id) -> str</code>
73+
- <code title="delete /v1/users/{user_id}">client.users.<a href="./src/knockapi/resources/users/users.py">delete</a>(user_id) -> None</code>
7674
- <code title="get /v1/users/{user_id}">client.users.<a href="./src/knockapi/resources/users/users.py">get</a>(user_id) -> <a href="./src/knockapi/types/user.py">User</a></code>
7775
- <code title="get /v1/users/{user_id}/channel_data/{channel_id}">client.users.<a href="./src/knockapi/resources/users/users.py">get_channel_data</a>(user_id, channel_id) -> <a href="./src/knockapi/types/recipients/channel_data.py">ChannelData</a></code>
7876
- <code title="get /v1/users/{user_id}/preferences/{id}">client.users.<a href="./src/knockapi/resources/users/users.py">get_preferences</a>(user_id, id, \*\*<a href="src/knockapi/types/user_get_preferences_params.py">params</a>) -> <a href="./src/knockapi/types/recipients/preference_set.py">PreferenceSet</a></code>
@@ -83,7 +81,7 @@ Methods:
8381
- <code title="post /v1/users/{user_id}/merge">client.users.<a href="./src/knockapi/resources/users/users.py">merge</a>(user_id, \*\*<a href="src/knockapi/types/user_merge_params.py">params</a>) -> <a href="./src/knockapi/types/user.py">User</a></code>
8482
- <code title="put /v1/users/{user_id}/channel_data/{channel_id}">client.users.<a href="./src/knockapi/resources/users/users.py">set_channel_data</a>(user_id, channel_id, \*\*<a href="src/knockapi/types/user_set_channel_data_params.py">params</a>) -> <a href="./src/knockapi/types/recipients/channel_data.py">ChannelData</a></code>
8583
- <code title="put /v1/users/{user_id}/preferences/{id}">client.users.<a href="./src/knockapi/resources/users/users.py">set_preferences</a>(user_id, id, \*\*<a href="src/knockapi/types/user_set_preferences_params.py">params</a>) -> <a href="./src/knockapi/types/recipients/preference_set.py">PreferenceSet</a></code>
86-
- <code title="delete /v1/users/{user_id}/channel_data/{channel_id}">client.users.<a href="./src/knockapi/resources/users/users.py">unset_channel_data</a>(user_id, channel_id) -> str</code>
84+
- <code title="delete /v1/users/{user_id}/channel_data/{channel_id}">client.users.<a href="./src/knockapi/resources/users/users.py">unset_channel_data</a>(user_id, channel_id) -> None</code>
8785

8886
## Feeds
8987

@@ -134,18 +132,16 @@ Types:
134132
from knockapi.types import (
135133
InlineObjectRequest,
136134
Object,
137-
ObjectDeleteResponse,
138135
ObjectAddSubscriptionsResponse,
139136
ObjectDeleteSubscriptionsResponse,
140137
ObjectListPreferencesResponse,
141-
ObjectUnsetChannelDataResponse,
142138
)
143139
```
144140

145141
Methods:
146142

147143
- <code title="get /v1/objects/{collection}">client.objects.<a href="./src/knockapi/resources/objects/objects.py">list</a>(collection, \*\*<a href="src/knockapi/types/object_list_params.py">params</a>) -> <a href="./src/knockapi/types/object.py">SyncEntriesCursor[Object]</a></code>
148-
- <code title="delete /v1/objects/{collection}/{id}">client.objects.<a href="./src/knockapi/resources/objects/objects.py">delete</a>(collection, id) -> str</code>
144+
- <code title="delete /v1/objects/{collection}/{id}">client.objects.<a href="./src/knockapi/resources/objects/objects.py">delete</a>(collection, id) -> None</code>
149145
- <code title="post /v1/objects/{collection}/{object_id}/subscriptions">client.objects.<a href="./src/knockapi/resources/objects/objects.py">add_subscriptions</a>(collection, object_id, \*\*<a href="src/knockapi/types/object_add_subscriptions_params.py">params</a>) -> <a href="./src/knockapi/types/object_add_subscriptions_response.py">ObjectAddSubscriptionsResponse</a></code>
150146
- <code title="delete /v1/objects/{collection}/{object_id}/subscriptions">client.objects.<a href="./src/knockapi/resources/objects/objects.py">delete_subscriptions</a>(collection, object_id, \*\*<a href="src/knockapi/types/object_delete_subscriptions_params.py">params</a>) -> <a href="./src/knockapi/types/object_delete_subscriptions_response.py">ObjectDeleteSubscriptionsResponse</a></code>
151147
- <code title="get /v1/objects/{collection}/{id}">client.objects.<a href="./src/knockapi/resources/objects/objects.py">get</a>(collection, id) -> <a href="./src/knockapi/types/object.py">Object</a></code>
@@ -158,7 +154,7 @@ Methods:
158154
- <code title="put /v1/objects/{collection}/{id}">client.objects.<a href="./src/knockapi/resources/objects/objects.py">set</a>(collection, id, \*\*<a href="src/knockapi/types/object_set_params.py">params</a>) -> <a href="./src/knockapi/types/object.py">Object</a></code>
159155
- <code title="put /v1/objects/{collection}/{object_id}/channel_data/{channel_id}">client.objects.<a href="./src/knockapi/resources/objects/objects.py">set_channel_data</a>(collection, object_id, channel_id, \*\*<a href="src/knockapi/types/object_set_channel_data_params.py">params</a>) -> <a href="./src/knockapi/types/recipients/channel_data.py">ChannelData</a></code>
160156
- <code title="put /v1/objects/{collection}/{object_id}/preferences/{id}">client.objects.<a href="./src/knockapi/resources/objects/objects.py">set_preferences</a>(collection, object_id, id, \*\*<a href="src/knockapi/types/object_set_preferences_params.py">params</a>) -> <a href="./src/knockapi/types/recipients/preference_set.py">PreferenceSet</a></code>
161-
- <code title="delete /v1/objects/{collection}/{object_id}/channel_data/{channel_id}">client.objects.<a href="./src/knockapi/resources/objects/objects.py">unset_channel_data</a>(collection, object_id, channel_id) -> str</code>
157+
- <code title="delete /v1/objects/{collection}/{object_id}/channel_data/{channel_id}">client.objects.<a href="./src/knockapi/resources/objects/objects.py">unset_channel_data</a>(collection, object_id, channel_id) -> None</code>
162158

163159
## Bulk
164160

@@ -173,13 +169,13 @@ Methods:
173169
Types:
174170

175171
```python
176-
from knockapi.types import InlineTenantRequest, Tenant, TenantRequest, TenantDeleteResponse
172+
from knockapi.types import InlineTenantRequest, Tenant, TenantRequest
177173
```
178174

179175
Methods:
180176

181177
- <code title="get /v1/tenants">client.tenants.<a href="./src/knockapi/resources/tenants/tenants.py">list</a>(\*\*<a href="src/knockapi/types/tenant_list_params.py">params</a>) -> <a href="./src/knockapi/types/tenant.py">SyncEntriesCursor[Tenant]</a></code>
182-
- <code title="delete /v1/tenants/{id}">client.tenants.<a href="./src/knockapi/resources/tenants/tenants.py">delete</a>(id) -> str</code>
178+
- <code title="delete /v1/tenants/{id}">client.tenants.<a href="./src/knockapi/resources/tenants/tenants.py">delete</a>(id) -> None</code>
183179
- <code title="get /v1/tenants/{id}">client.tenants.<a href="./src/knockapi/resources/tenants/tenants.py">get</a>(id) -> <a href="./src/knockapi/types/tenant.py">Tenant</a></code>
184180
- <code title="put /v1/tenants/{id}">client.tenants.<a href="./src/knockapi/resources/tenants/tenants.py">set</a>(id, \*\*<a href="src/knockapi/types/tenant_set_params.py">params</a>) -> <a href="./src/knockapi/types/tenant.py">Tenant</a></code>
185181

@@ -331,12 +327,12 @@ Methods:
331327
Types:
332328

333329
```python
334-
from knockapi.types import WorkflowCancelResponse, WorkflowTriggerResponse
330+
from knockapi.types import WorkflowTriggerResponse
335331
```
336332

337333
Methods:
338334

339-
- <code title="post /v1/workflows/{key}/cancel">client.workflows.<a href="./src/knockapi/resources/workflows.py">cancel</a>(key, \*\*<a href="src/knockapi/types/workflow_cancel_params.py">params</a>) -> str</code>
335+
- <code title="post /v1/workflows/{key}/cancel">client.workflows.<a href="./src/knockapi/resources/workflows.py">cancel</a>(key, \*\*<a href="src/knockapi/types/workflow_cancel_params.py">params</a>) -> None</code>
340336
- <code title="post /v1/workflows/{key}/trigger">client.workflows.<a href="./src/knockapi/resources/workflows.py">trigger</a>(key, \*\*<a href="src/knockapi/types/workflow_trigger_params.py">params</a>) -> <a href="./src/knockapi/types/workflow_trigger_response.py">WorkflowTriggerResponse</a></code>
341337

342338
# Schedules
@@ -379,16 +375,11 @@ Methods:
379375
Types:
380376

381377
```python
382-
from knockapi.types import (
383-
AudienceMember,
384-
AudienceAddMembersResponse,
385-
AudienceListMembersResponse,
386-
AudienceRemoveMembersResponse,
387-
)
378+
from knockapi.types import AudienceMember, AudienceListMembersResponse
388379
```
389380

390381
Methods:
391382

392-
- <code title="post /v1/audiences/{key}/members">client.audiences.<a href="./src/knockapi/resources/audiences.py">add_members</a>(key, \*\*<a href="src/knockapi/types/audience_add_members_params.py">params</a>) -> str</code>
383+
- <code title="post /v1/audiences/{key}/members">client.audiences.<a href="./src/knockapi/resources/audiences.py">add_members</a>(key, \*\*<a href="src/knockapi/types/audience_add_members_params.py">params</a>) -> None</code>
393384
- <code title="get /v1/audiences/{key}/members">client.audiences.<a href="./src/knockapi/resources/audiences.py">list_members</a>(key) -> <a href="./src/knockapi/types/audience_list_members_response.py">AudienceListMembersResponse</a></code>
394-
- <code title="delete /v1/audiences/{key}/members">client.audiences.<a href="./src/knockapi/resources/audiences.py">remove_members</a>(key, \*\*<a href="src/knockapi/types/audience_remove_members_params.py">params</a>) -> str</code>
385+
- <code title="delete /v1/audiences/{key}/members">client.audiences.<a href="./src/knockapi/resources/audiences.py">remove_members</a>(key, \*\*<a href="src/knockapi/types/audience_remove_members_params.py">params</a>) -> None</code>

mypy.ini

Lines changed: 0 additions & 50 deletions
This file was deleted.

pyproject.toml

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "knockapi"
3-
version = "1.12.1"
3+
version = "1.13.0"
44
description = "The official Python library for the knock API"
55
dynamic = ["readme"]
66
license = "Apache-2.0"
@@ -56,7 +56,6 @@ dev-dependencies = [
5656
"dirty-equals>=0.6.0",
5757
"importlib-metadata>=6.7.0",
5858
"rich>=13.7.1",
59-
"nest_asyncio==1.6.0",
6059
"pytest-xdist>=3.6.1",
6160
]
6261

@@ -148,6 +147,7 @@ exclude = [
148147
"_dev",
149148
".venv",
150149
".nox",
150+
".git",
151151
]
152152

153153
reportImplicitOverride = true
@@ -156,6 +156,58 @@ reportOverlappingOverload = false
156156
reportImportCycles = false
157157
reportPrivateUsage = false
158158

159+
[tool.mypy]
160+
pretty = true
161+
show_error_codes = true
162+
163+
# Exclude _files.py because mypy isn't smart enough to apply
164+
# the correct type narrowing and as this is an internal module
165+
# it's fine to just use Pyright.
166+
#
167+
# We also exclude our `tests` as mypy doesn't always infer
168+
# types correctly and Pyright will still catch any type errors.
169+
exclude = ['src/knockapi/_files.py', '_dev/.*.py', 'tests/.*']
170+
171+
strict_equality = true
172+
implicit_reexport = true
173+
check_untyped_defs = true
174+
no_implicit_optional = true
175+
176+
warn_return_any = true
177+
warn_unreachable = true
178+
warn_unused_configs = true
179+
180+
# Turn these options off as it could cause conflicts
181+
# with the Pyright options.
182+
warn_unused_ignores = false
183+
warn_redundant_casts = false
184+
185+
disallow_any_generics = true
186+
disallow_untyped_defs = true
187+
disallow_untyped_calls = true
188+
disallow_subclassing_any = true
189+
disallow_incomplete_defs = true
190+
disallow_untyped_decorators = true
191+
cache_fine_grained = true
192+
193+
# By default, mypy reports an error if you assign a value to the result
194+
# of a function call that doesn't return anything. We do this in our test
195+
# cases:
196+
# ```
197+
# result = ...
198+
# assert result is None
199+
# ```
200+
# Changing this codegen to make mypy happy would increase complexity
201+
# and would not be worth it.
202+
disable_error_code = "func-returns-value,overload-cannot-match"
203+
204+
# https://github.com/python/mypy/issues/12162
205+
[[tool.mypy.overrides]]
206+
module = "black.files.*"
207+
ignore_errors = true
208+
ignore_missing_imports = true
209+
210+
159211
[tool.ruff]
160212
line-length = 120
161213
output-format = "grouped"

requirements-dev.lock

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ multidict==6.4.4
7575
mypy==1.14.1
7676
mypy-extensions==1.0.0
7777
# via mypy
78-
nest-asyncio==1.6.0
7978
nodeenv==1.8.0
8079
# via pyright
8180
nox==2023.4.22
@@ -89,9 +88,9 @@ pluggy==1.5.0
8988
propcache==0.3.1
9089
# via aiohttp
9190
# via yarl
92-
pydantic==2.10.3
91+
pydantic==2.11.9
9392
# via knockapi
94-
pydantic-core==2.27.1
93+
pydantic-core==2.33.2
9594
# via pydantic
9695
pygments==2.18.0
9796
# via rich
@@ -127,6 +126,9 @@ typing-extensions==4.12.2
127126
# via pydantic
128127
# via pydantic-core
129128
# via pyright
129+
# via typing-inspection
130+
typing-inspection==0.4.1
131+
# via pydantic
130132
virtualenv==20.24.5
131133
# via nox
132134
yarl==1.20.0

requirements.lock

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ multidict==6.4.4
5555
propcache==0.3.1
5656
# via aiohttp
5757
# via yarl
58-
pydantic==2.10.3
58+
pydantic==2.11.9
5959
# via knockapi
60-
pydantic-core==2.27.1
60+
pydantic-core==2.33.2
6161
# via pydantic
6262
sniffio==1.3.0
6363
# via anyio
@@ -68,5 +68,8 @@ typing-extensions==4.12.2
6868
# via multidict
6969
# via pydantic
7070
# via pydantic-core
71+
# via typing-inspection
72+
typing-inspection==0.4.1
73+
# via pydantic
7174
yarl==1.20.0
7275
# via aiohttp

scripts/bootstrap

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,18 @@ set -e
44

55
cd "$(dirname "$0")/.."
66

7-
if ! command -v rye >/dev/null 2>&1 && [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ]; then
7+
if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "$SKIP_BREW" != "1" ] && [ -t 0 ]; then
88
brew bundle check >/dev/null 2>&1 || {
9-
echo "==> Installing Homebrew dependencies…"
10-
brew bundle
9+
echo -n "==> Install Homebrew dependencies? (y/N): "
10+
read -r response
11+
case "$response" in
12+
[yY][eE][sS]|[yY])
13+
brew bundle
14+
;;
15+
*)
16+
;;
17+
esac
18+
echo
1119
}
1220
fi
1321

0 commit comments

Comments
 (0)