Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ jobs:
github.repository == 'stainless-sdks/courier-ruby' &&
(github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata')
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
with:
bundler-cache: false
- run: |-
Expand All @@ -39,7 +39,7 @@ jobs:
github.repository == 'stainless-sdks/courier-ruby' &&
!startsWith(github.ref, 'refs/heads/stl/')
id: github-oidc
uses: actions/github-script@v8
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
script: core.setOutput('github_token', await core.getIDToken());

Expand All @@ -60,9 +60,9 @@ jobs:
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
with:
bundler-cache: false
- run: |-
Expand All @@ -76,9 +76,9 @@ jobs:
runs-on: ${{ github.repository == 'stainless-sdks/courier-ruby' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
with:
bundler-cache: false
- run: |-
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/publish-gem.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set up Ruby
uses: ruby/setup-ruby@v1
uses: ruby/setup-ruby@c4e5b1316158f92e3d49443a9d58b31d25ac0f8f # v1.306.0
with:
bundler-cache: false
- run: |-
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-doctor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
if: github.repository == 'trycourier/courier-ruby' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next')

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Check release environment
run: |
Expand Down
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "4.10.2"
".": "4.11.0"
}
8 changes: 4 additions & 4 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 103
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/courier%2Fcourier-3f78581b4e078a1f620d9f587f18d77bcde6d20f56b0e4ae798648f4236494fb.yml
openapi_spec_hash: 6bd33e0396d85e11bb46f0d549af93a3
config_hash: afcc4f6f8c33ca3f338589e32e086f56
configured_endpoints: 117
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/courier/courier-8e7ad3d889c555ff9c381518b627b24b85e3eb7376bdc3689adc7a96ec78e537.yml
openapi_spec_hash: 53b3680aae719487c56efaa782bbe5b2
config_hash: 10bd597dd6cc89023541bc551b6532b8
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,26 @@
# Changelog

## 4.11.0 (2026-05-19)

Full Changelog: [v4.10.2...v4.11.0](https://github.com/trycourier/courier-ruby/compare/v4.10.2...v4.11.0)

### Features

* [C-18380] Journeys API reference: copy + naming cleanup ([5930853](https://github.com/trycourier/courier-ruby/commit/5930853b36e87fc434a5f316d5144459d8a5156c))
* [SUP-607] Add DELETE endpoint for Courier Create tenant templates ([72df650](https://github.com/trycourier/courier-ruby/commit/72df650b8e3e6bde00a5a8f047c16e77f2c97ac3))
* **api:** add journey CRUD/templates/versioning endpoints, journey node/condition types ([30bc8f6](https://github.com/trycourier/courier-ruby/commit/30bc8f6ad778a9ca44ed7ccbfa743e23170192b4))
* support setting headers via env ([6f99d29](https://github.com/trycourier/courier-ruby/commit/6f99d290cad4006de8f84b22cbac6694d314a3aa))


### Bug Fixes

* **client:** elide content type header on requests without body ([5f06485](https://github.com/trycourier/courier-ruby/commit/5f0648580bf65a97989fbb1f6583ef7166c43c2f))


### Chores

* **internal:** more robust bootstrap script ([91e8fd1](https://github.com/trycourier/courier-ruby/commit/91e8fd1ecdd6d10def9215f53a73248b754b5386))

## 4.10.2 (2026-04-14)

Full Changelog: [v4.10.1...v4.10.2](https://github.com/trycourier/courier-ruby/compare/v4.10.1...v4.10.2)
Expand Down
2 changes: 1 addition & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ GIT
PATH
remote: .
specs:
trycourier (4.10.2)
trycourier (4.11.0)
cgi
connection_pool

Expand Down
44 changes: 44 additions & 0 deletions lib/courier.rb
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,12 @@
require_relative "courier/models/base_check"
require_relative "courier/models/subscription_topic_new"
require_relative "courier/models/elemental_channel_node"
require_relative "courier/models/create_journey_request"
require_relative "courier/models/journeys_invoke_request"
require_relative "courier/models/journey_publish_request"
require_relative "courier/models/journey_template_create_request"
require_relative "courier/models/journey_template_publish_request"
require_relative "courier/models/journey_template_replace_request"
require_relative "courier/models/message_details"
require_relative "courier/models/notification_template_create_request"
require_relative "courier/models/notification_template_publish_request"
Expand Down Expand Up @@ -154,10 +159,47 @@
require_relative "courier/models/intercom"
require_relative "courier/models/intercom_recipient"
require_relative "courier/models/journey"
require_relative "courier/models/journey_ai_node"
require_relative "courier/models/journey_api_invoke_trigger_node"
require_relative "courier/models/journey_archive_params"
require_relative "courier/models/journey_condition_atom"
require_relative "courier/models/journey_condition_group"
require_relative "courier/models/journey_condition_nested_group"
require_relative "courier/models/journey_conditions_field"
require_relative "courier/models/journey_create_params"
require_relative "courier/models/journey_delay_duration_node"
require_relative "courier/models/journey_delay_until_node"
require_relative "courier/models/journey_exit_node"
require_relative "courier/models/journey_fetch_get_delete_node"
require_relative "courier/models/journey_fetch_post_put_node"
require_relative "courier/models/journey_invoke_params"
require_relative "courier/models/journey_list_params"
require_relative "courier/models/journey_list_versions_params"
require_relative "courier/models/journey_merge_strategy"
require_relative "courier/models/journey_node"
require_relative "courier/models/journey_publish_params"
require_relative "courier/models/journey_replace_params"
require_relative "courier/models/journey_response"
require_relative "courier/models/journey_retrieve_params"
require_relative "courier/models/journeys/template_archive_params"
require_relative "courier/models/journeys/template_create_params"
require_relative "courier/models/journeys/template_list_params"
require_relative "courier/models/journeys/template_list_versions_params"
require_relative "courier/models/journeys/template_publish_params"
require_relative "courier/models/journeys/template_replace_params"
require_relative "courier/models/journeys/template_retrieve_params"
require_relative "courier/models/journey_segment_trigger_node"
require_relative "courier/models/journey_send_node"
require_relative "courier/models/journeys_invoke_response"
require_relative "courier/models/journeys_list_response"
require_relative "courier/models/journey_state"
require_relative "courier/models/journey_template_get_response"
require_relative "courier/models/journey_template_list_response"
require_relative "courier/models/journey_template_summary"
require_relative "courier/models/journey_throttle_dynamic_node"
require_relative "courier/models/journey_throttle_static_node"
require_relative "courier/models/journey_version_item"
require_relative "courier/models/journey_versions_list_response"
require_relative "courier/models/list_delete_params"
require_relative "courier/models/list_filter"
require_relative "courier/models/list_list_params"
Expand Down Expand Up @@ -291,6 +333,7 @@
require_relative "courier/models/tenant_retrieve_params"
require_relative "courier/models/tenants/preferences/item_delete_params"
require_relative "courier/models/tenants/preferences/item_update_params"
require_relative "courier/models/tenants/template_delete_params"
require_relative "courier/models/tenants/template_list_params"
require_relative "courier/models/tenants/template_list_response"
require_relative "courier/models/tenants/template_publish_params"
Expand Down Expand Up @@ -348,6 +391,7 @@
require_relative "courier/resources/bulk"
require_relative "courier/resources/inbound"
require_relative "courier/resources/journeys"
require_relative "courier/resources/journeys/templates"
require_relative "courier/resources/lists"
require_relative "courier/resources/lists/subscriptions"
require_relative "courier/resources/messages"
Expand Down
16 changes: 15 additions & 1 deletion lib/courier/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -112,14 +112,28 @@ def initialize(
raise ArgumentError.new("api_key is required, and can be set via environ: \"COURIER_API_KEY\"")
end

headers = {}
custom_headers_env = ENV["COURIER_CUSTOM_HEADERS"]
unless custom_headers_env.nil?
parsed = {}
custom_headers_env.split("\n").each do |line|
colon = line.index(":")
unless colon.nil?
parsed[line[0...colon].strip] = line[(colon + 1)..].strip
end
end
headers = parsed.merge(headers)
end

@api_key = api_key.to_s

super(
base_url: base_url,
timeout: timeout,
max_retries: max_retries,
initial_retry_delay: initial_retry_delay,
max_retry_delay: max_retry_delay
max_retry_delay: max_retry_delay,
headers: headers
)

@send_ = Courier::Resources::Send.new(client: self)
Expand Down
2 changes: 2 additions & 0 deletions lib/courier/internal/transport/base_client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,8 @@ def initialize(
Courier::Internal::Util.deep_merge(*[req[:body], opts[:extra_body]].compact)
end

headers.delete("content-type") if body.nil?

url = Courier::Internal::Util.join_parsed_uri(
@base_url_components,
{**req, path: path, query: query}
Expand Down
73 changes: 73 additions & 0 deletions lib/courier/models.rb
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ module Courier

Check = Courier::Models::Check

CreateJourneyRequest = Courier::Models::CreateJourneyRequest

DefaultPreferences = Courier::Models::DefaultPreferences

DeviceType = Courier::Models::DeviceType
Expand Down Expand Up @@ -191,16 +193,87 @@ module Courier

Journey = Courier::Models::Journey

JourneyAINode = Courier::Models::JourneyAINode

JourneyAPIInvokeTriggerNode = Courier::Models::JourneyAPIInvokeTriggerNode

JourneyArchiveParams = Courier::Models::JourneyArchiveParams

# @type [Courier::Internal::Type::Converter]
JourneyConditionAtom = Courier::Models::JourneyConditionAtom

JourneyConditionGroup = Courier::Models::JourneyConditionGroup

JourneyConditionNestedGroup = Courier::Models::JourneyConditionNestedGroup

JourneyConditionsField = Courier::Models::JourneyConditionsField

JourneyCreateParams = Courier::Models::JourneyCreateParams

JourneyDelayDurationNode = Courier::Models::JourneyDelayDurationNode

JourneyDelayUntilNode = Courier::Models::JourneyDelayUntilNode

JourneyExitNode = Courier::Models::JourneyExitNode

JourneyFetchGetDeleteNode = Courier::Models::JourneyFetchGetDeleteNode

JourneyFetchPostPutNode = Courier::Models::JourneyFetchPostPutNode

JourneyInvokeParams = Courier::Models::JourneyInvokeParams

JourneyListParams = Courier::Models::JourneyListParams

JourneyListVersionsParams = Courier::Models::JourneyListVersionsParams

JourneyMergeStrategy = Courier::Models::JourneyMergeStrategy

JourneyNode = Courier::Models::JourneyNode

JourneyPublishParams = Courier::Models::JourneyPublishParams

JourneyPublishRequest = Courier::Models::JourneyPublishRequest

JourneyReplaceParams = Courier::Models::JourneyReplaceParams

JourneyResponse = Courier::Models::JourneyResponse

JourneyRetrieveParams = Courier::Models::JourneyRetrieveParams

Journeys = Courier::Models::Journeys

JourneySegmentTriggerNode = Courier::Models::JourneySegmentTriggerNode

JourneySendNode = Courier::Models::JourneySendNode

JourneysInvokeRequest = Courier::Models::JourneysInvokeRequest

JourneysInvokeResponse = Courier::Models::JourneysInvokeResponse

JourneysListResponse = Courier::Models::JourneysListResponse

JourneyState = Courier::Models::JourneyState

JourneyTemplateCreateRequest = Courier::Models::JourneyTemplateCreateRequest

JourneyTemplateGetResponse = Courier::Models::JourneyTemplateGetResponse

JourneyTemplateListResponse = Courier::Models::JourneyTemplateListResponse

JourneyTemplatePublishRequest = Courier::Models::JourneyTemplatePublishRequest

JourneyTemplateReplaceRequest = Courier::Models::JourneyTemplateReplaceRequest

JourneyTemplateSummary = Courier::Models::JourneyTemplateSummary

JourneyThrottleDynamicNode = Courier::Models::JourneyThrottleDynamicNode

JourneyThrottleStaticNode = Courier::Models::JourneyThrottleStaticNode

JourneyVersionItem = Courier::Models::JourneyVersionItem

JourneyVersionsListResponse = Courier::Models::JourneyVersionsListResponse

ListDeleteParams = Courier::Models::ListDeleteParams

ListFilter = Courier::Models::ListFilter
Expand Down
39 changes: 39 additions & 0 deletions lib/courier/models/create_journey_request.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# frozen_string_literal: true

module Courier
module Models
class CreateJourneyRequest < Courier::Internal::Type::BaseModel
# @!attribute name
#
# @return [String]
required :name, String

# @!attribute nodes
#
# @return [Array<Courier::Models::JourneyAPIInvokeTriggerNode, Courier::Models::JourneySegmentTriggerNode, Courier::Models::JourneySendNode, Courier::Models::JourneyDelayDurationNode, Courier::Models::JourneyDelayUntilNode, Courier::Models::JourneyFetchGetDeleteNode, Courier::Models::JourneyFetchPostPutNode, Courier::Models::JourneyAINode, Courier::Models::JourneyThrottleStaticNode, Courier::Models::JourneyThrottleDynamicNode, Courier::Models::JourneyExitNode, Courier::Models::JourneyNode::JourneyBranchNode>]
required :nodes, -> { Courier::Internal::Type::ArrayOf[union: Courier::JourneyNode] }

# @!attribute enabled
#
# @return [Boolean, nil]
optional :enabled, Courier::Internal::Type::Boolean

# @!attribute state
# Lifecycle state of a journey.
#
# @return [Symbol, Courier::Models::JourneyState, nil]
optional :state, enum: -> { Courier::JourneyState }

# @!method initialize(name:, nodes:, enabled: nil, state: nil)
# Request body for creating a journey.
#
# @param name [String]
#
# @param nodes [Array<Courier::Models::JourneyAPIInvokeTriggerNode, Courier::Models::JourneySegmentTriggerNode, Courier::Models::JourneySendNode, Courier::Models::JourneyDelayDurationNode, Courier::Models::JourneyDelayUntilNode, Courier::Models::JourneyFetchGetDeleteNode, Courier::Models::JourneyFetchPostPutNode, Courier::Models::JourneyAINode, Courier::Models::JourneyThrottleStaticNode, Courier::Models::JourneyThrottleDynamicNode, Courier::Models::JourneyExitNode, Courier::Models::JourneyNode::JourneyBranchNode>]
#
# @param enabled [Boolean]
#
# @param state [Symbol, Courier::Models::JourneyState] Lifecycle state of a journey.
end
end
end
Loading