Skip to content

Commit 9917bab

Browse files
authored
Merge branch 'main' into dependabot/github_actions/JasonEtco/create-an-issue-2.9.2
2 parents b315160 + 7ae26be commit 9917bab

File tree

150 files changed

+35323
-23
lines changed

Some content is hidden

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

150 files changed

+35323
-23
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@
33
Note: For changes to the API, see https://shopify.dev/changelog?filter=api
44
## Unreleased
55

6+
## 14.11.1
7+
8+
- [#1395](https://github.com/Shopify/shopify-api-ruby/pull/1395) use correct internal admin host for 1P app development
9+
10+
## 14.11.0
11+
- [#1386](https://github.com/Shopify/shopify-api-ruby/pull/1386) Add support for 2025-07 API version
12+
613
## 14.10.0
714

815
- [#1374](https://github.com/Shopify/shopify-api-ruby/pull/1374) Fix edge cases for Shopify internal hosts

Gemfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
PATH
22
remote: .
33
specs:
4-
shopify_api (14.10.0)
4+
shopify_api (14.11.1)
55
activesupport
66
concurrent-ruby
77
hash_diff
@@ -125,7 +125,7 @@ GEM
125125
thor (>= 0.19.2)
126126
syntax_tree (6.2.0)
127127
prettier_print (>= 1.2.0)
128-
tapioca (0.13.3)
128+
tapioca (0.15.1)
129129
bundler (>= 2.2.25)
130130
netrc (>= 0.11.0)
131131
parallel (>= 1.21.0)

RELEASING.md

Lines changed: 108 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,110 @@
11
# Releasing ShopifyAPI
22

3-
1. Before releasing, make sure `sorbet` and related gems are up to date:
4-
`bundle update sorbet sorbet-runtime sorbet-static tapioca --conservative`
5-
1. Check the Semantic Versioning page for info on how to version the new release: http://semver.org
6-
1. Update the version of ShopifyAPI in lib/shopify_api/version.rb
7-
1. Run `bundle`
8-
1. Add a CHANGELOG entry for the new release
9-
1. Commit the changes with a commit message like "Packaging for release X.Y.Z"
10-
1. Tag the release with the version (Leave REV blank for HEAD or provide a SHA)
11-
$ git tag vX.Y.Z REV
12-
1. Push out the changes
13-
$ git push
14-
1. Push out the tags
15-
$ git push --tags
16-
1. Publish the gem using Shipit
17-
1. Consider if the dependency in Shopify/shopify needs updated. It's used only by the tests so is a low risk change.
18-
Also consider Shopify/shopify_app whose gemspec depends on this.
19-
We don't need to do this for every release, but we should try to keep them relatively up to date.
3+
## Prerequisites
4+
5+
Before starting a release, ensure you have:
6+
7+
- Merged all code change PRs into main
8+
9+
## Release Process
10+
11+
### Step 1: Prepare the Release Branch
12+
13+
1. **Ensure all feature changes are merged**
14+
15+
```bash
16+
git checkout main
17+
git pull origin main
18+
```
19+
20+
Verify: Latest commits should match GitHub's main branch.
21+
22+
2. **Review changes to determine version bump**
23+
- Review merged PRs since last release: `git log v14.11.1..HEAD --oneline`
24+
- Apply [semantic versioning](https://semver.org/):
25+
- PATCH (X.Y.Z+1): Bug fixes only
26+
- MINOR (X.Y+1.0): New features, backward compatible
27+
- MAJOR (X+1.0.0): Breaking changes
28+
29+
### Step 2: Create Release Pull Request
30+
31+
1. **Create a new branch**
32+
33+
```bash
34+
git checkout -b vX.Y.Z
35+
```
36+
37+
2. **Update version number**
38+
Edit `lib/shopify_api/version.rb`:
39+
40+
```ruby
41+
module ShopifyAPI
42+
VERSION = "X.Y.Z" # Replace with your version
43+
end
44+
```
45+
46+
3. **Update dependencies**
47+
48+
```bash
49+
bundle update sorbet sorbet-runtime sorbet-static tapioca --conservative
50+
bundle install
51+
```
52+
53+
Expected: Gemfile.lock updates with new dependency versions.
54+
55+
4. **Update CHANGELOG**
56+
- Add entry under "## Unreleased" with format:
57+
58+
```markdown
59+
## X.Y.Z (YYYY-MM-DD)
60+
61+
- [#PR_NUMBER](https://github.com/Shopify/shopify-api-ruby/pull/PR_NUMBER) Description of change
62+
```
63+
64+
- Move all unreleased items under the new version
65+
66+
5. **Create and push PR**
67+
68+
```bash
69+
git add -A
70+
git commit -m "preparing for release v X.Y.Z"
71+
git push origin release-X.Y.Z
72+
```
73+
74+
- Title PR: "Release vX.Y.Z"
75+
- Add release notes to PR description
76+
77+
### Step 3: Tag and Publish
78+
79+
1. **After PR is merged, update local main**
80+
81+
```bash
82+
git checkout main
83+
git pull origin main
84+
```
85+
86+
Verify: `git log -1` shows your merge commit.
87+
88+
2. **Create and push tag**
89+
90+
```bash
91+
git tag -f vX.Y.Z && git push origin vX.Y.Z
92+
```
93+
94+
Verify: Tag appears at [https://github.com/Shopify/shopify-api-ruby/tags](https://github.com/Shopify/shopify-api-ruby/tags)
95+
96+
3. **Publish via Shipit**
97+
98+
4. **Verify gem publication**
99+
100+
List the gem on [https://rubygems.org/gems/shopify_api](https://rubygems.org/gems/shopify_api/versions/)
101+
102+
Expected: Shows your new version (may take 5-10 minutes).
103+
104+
### Step 4: Update Dependent Projects (Optional)
105+
106+
For major/minor releases, update these repositories:
107+
108+
- **Shopify/shopify_app**: Update gemspec
109+
- File: `shopify_app.gemspec`
110+
- Priority: High for breaking changes, medium otherwise

lib/shopify_api/admin_versions.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module ShopifyAPI
55
module AdminVersions
66
SUPPORTED_ADMIN_VERSIONS = T.let([
77
"unstable",
8+
"2025-10",
89
"2025-07",
910
"2025-04",
1011
"2025-01",
@@ -22,8 +23,8 @@ module AdminVersions
2223
"2022-01",
2324
], T::Array[String])
2425

25-
LATEST_SUPPORTED_ADMIN_VERSION = T.let("2025-04", String)
26-
RELEASE_CANDIDATE_ADMIN_VERSION = T.let("2025-07", String)
26+
LATEST_SUPPORTED_ADMIN_VERSION = T.let("2025-07", String)
27+
RELEASE_CANDIDATE_ADMIN_VERSION = T.let("2025-10", String)
2728
end
2829

2930
SUPPORTED_ADMIN_VERSIONS = ShopifyAPI::AdminVersions::SUPPORTED_ADMIN_VERSIONS

lib/shopify_api/auth/oauth.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@ def auth_base_uri(shop)
114114
return "https://#{shop}/admin" unless defined?(DevServer) && shop.include?(".my.shop.dev")
115115

116116
# For first-party apps in development only, we leverage DevServer to build the admin base URI
117-
admin_web = T.unsafe(Object.const_get("DevServer")).new("web") # rubocop:disable Sorbet/ConstantsFromStrings
117+
admin_web = T.unsafe(Object.const_get("DevServer")) # rubocop:disable Sorbet/ConstantsFromStrings
118+
.new("admin-web")
118119
admin_host = admin_web.host!(nonstandard_host_prefix: "admin")
119120
shop_name = shop.split(".").first
120121

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
# typed: false
2+
# frozen_string_literal: true
3+
4+
########################################################################################################################
5+
# This file is auto-generated. If you have an issue, please create a GitHub issue. #
6+
########################################################################################################################
7+
8+
module ShopifyAPI
9+
class AbandonedCheckout < ShopifyAPI::Rest::Base
10+
extend T::Sig
11+
12+
@prev_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar)
13+
@next_page_info = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar)
14+
15+
@api_call_limit = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar)
16+
@retry_request_after = T.let(Concurrent::ThreadLocalVar.new { nil }, Concurrent::ThreadLocalVar)
17+
18+
sig { params(session: T.nilable(ShopifyAPI::Auth::Session), from_hash: T.nilable(T::Hash[T.untyped, T.untyped])).void }
19+
def initialize(session: ShopifyAPI::Context.active_session, from_hash: nil)
20+
21+
@abandoned_checkout_url = T.let(nil, T.nilable(String))
22+
@billing_address = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped]))
23+
@buyer_accepts_marketing = T.let(nil, T.nilable(T::Boolean))
24+
@buyer_accepts_sms_marketing = T.let(nil, T.nilable(T::Boolean))
25+
@cart_token = T.let(nil, T.nilable(String))
26+
@closed_at = T.let(nil, T.nilable(String))
27+
@completed_at = T.let(nil, T.nilable(String))
28+
@created_at = T.let(nil, T.nilable(String))
29+
@currency = T.let(nil, T.nilable(Currency))
30+
@customer = T.let(nil, T.nilable(Customer))
31+
@customer_locale = T.let(nil, T.nilable(String))
32+
@device_id = T.let(nil, T.nilable(Integer))
33+
@discount_codes = T.let(nil, T.nilable(T::Array[T.untyped]))
34+
@email = T.let(nil, T.nilable(String))
35+
@gateway = T.let(nil, T.nilable(String))
36+
@id = T.let(nil, T.nilable(Integer))
37+
@landing_site = T.let(nil, T.nilable(String))
38+
@line_items = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped]))
39+
@location_id = T.let(nil, T.nilable(Integer))
40+
@note = T.let(nil, T.nilable(String))
41+
@phone = T.let(nil, T.nilable(String))
42+
@presentment_currency = T.let(nil, T.nilable(String))
43+
@referring_site = T.let(nil, T.nilable(String))
44+
@shipping_address = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped]))
45+
@shipping_lines = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped]))
46+
@sms_marketing_phone = T.let(nil, T.nilable(String))
47+
@source_name = T.let(nil, T.nilable(String))
48+
@subtotal_price = T.let(nil, T.nilable(String))
49+
@tax_lines = T.let(nil, T.nilable(T::Hash[T.untyped, T.untyped]))
50+
@taxes_included = T.let(nil, T.nilable(T::Boolean))
51+
@token = T.let(nil, T.nilable(String))
52+
@total_discounts = T.let(nil, T.nilable(String))
53+
@total_duties = T.let(nil, T.nilable(String))
54+
@total_line_items_price = T.let(nil, T.nilable(String))
55+
@total_price = T.let(nil, T.nilable(String))
56+
@total_tax = T.let(nil, T.nilable(String))
57+
@total_weight = T.let(nil, T.nilable(Integer))
58+
@updated_at = T.let(nil, T.nilable(String))
59+
@user_id = T.let(nil, T.nilable(Integer))
60+
61+
super(session: session, from_hash: from_hash)
62+
end
63+
64+
@has_one = T.let({
65+
currency: Currency,
66+
customer: Customer
67+
}, T::Hash[Symbol, Class])
68+
@has_many = T.let({
69+
discount_codes: DiscountCode
70+
}, T::Hash[Symbol, Class])
71+
@paths = T.let([
72+
{http_method: :get, operation: :checkouts, ids: [], path: "checkouts.json"},
73+
{http_method: :get, operation: :checkouts, ids: [], path: "checkouts.json"}
74+
], T::Array[T::Hash[String, T.any(T::Array[Symbol], String, Symbol)]])
75+
76+
sig { returns(T.nilable(String)) }
77+
attr_reader :abandoned_checkout_url
78+
sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
79+
attr_reader :billing_address
80+
sig { returns(T.nilable(T::Boolean)) }
81+
attr_reader :buyer_accepts_marketing
82+
sig { returns(T.nilable(T::Boolean)) }
83+
attr_reader :buyer_accepts_sms_marketing
84+
sig { returns(T.nilable(String)) }
85+
attr_reader :cart_token
86+
sig { returns(T.nilable(String)) }
87+
attr_reader :closed_at
88+
sig { returns(T.nilable(String)) }
89+
attr_reader :completed_at
90+
sig { returns(T.nilable(String)) }
91+
attr_reader :created_at
92+
sig { returns(T.nilable(Currency)) }
93+
attr_reader :currency
94+
sig { returns(T.nilable(Customer)) }
95+
attr_reader :customer
96+
sig { returns(T.nilable(String)) }
97+
attr_reader :customer_locale
98+
sig { returns(T.nilable(Integer)) }
99+
attr_reader :device_id
100+
sig { returns(T.nilable(T::Array[DiscountCode])) }
101+
attr_reader :discount_codes
102+
sig { returns(T.nilable(String)) }
103+
attr_reader :email
104+
sig { returns(T.nilable(String)) }
105+
attr_reader :gateway
106+
sig { returns(T.nilable(Integer)) }
107+
attr_reader :id
108+
sig { returns(T.nilable(String)) }
109+
attr_reader :landing_site
110+
sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
111+
attr_reader :line_items
112+
sig { returns(T.nilable(Integer)) }
113+
attr_reader :location_id
114+
sig { returns(T.nilable(String)) }
115+
attr_reader :note
116+
sig { returns(T.nilable(String)) }
117+
attr_reader :phone
118+
sig { returns(T.nilable(String)) }
119+
attr_reader :presentment_currency
120+
sig { returns(T.nilable(String)) }
121+
attr_reader :referring_site
122+
sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
123+
attr_reader :shipping_address
124+
sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
125+
attr_reader :shipping_lines
126+
sig { returns(T.nilable(String)) }
127+
attr_reader :sms_marketing_phone
128+
sig { returns(T.nilable(String)) }
129+
attr_reader :source_name
130+
sig { returns(T.nilable(String)) }
131+
attr_reader :subtotal_price
132+
sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
133+
attr_reader :tax_lines
134+
sig { returns(T.nilable(T::Boolean)) }
135+
attr_reader :taxes_included
136+
sig { returns(T.nilable(String)) }
137+
attr_reader :token
138+
sig { returns(T.nilable(String)) }
139+
attr_reader :total_discounts
140+
sig { returns(T.nilable(String)) }
141+
attr_reader :total_duties
142+
sig { returns(T.nilable(String)) }
143+
attr_reader :total_line_items_price
144+
sig { returns(T.nilable(String)) }
145+
attr_reader :total_price
146+
sig { returns(T.nilable(String)) }
147+
attr_reader :total_tax
148+
sig { returns(T.nilable(Integer)) }
149+
attr_reader :total_weight
150+
sig { returns(T.nilable(String)) }
151+
attr_reader :updated_at
152+
sig { returns(T.nilable(Integer)) }
153+
attr_reader :user_id
154+
155+
class << self
156+
sig do
157+
params(
158+
since_id: T.untyped,
159+
created_at_min: T.untyped,
160+
created_at_max: T.untyped,
161+
updated_at_min: T.untyped,
162+
updated_at_max: T.untyped,
163+
status: T.untyped,
164+
limit: T.untyped,
165+
session: Auth::Session,
166+
kwargs: T.untyped
167+
).returns(T.untyped)
168+
end
169+
def checkouts(
170+
since_id: nil,
171+
created_at_min: nil,
172+
created_at_max: nil,
173+
updated_at_min: nil,
174+
updated_at_max: nil,
175+
status: nil,
176+
limit: nil,
177+
session: ShopifyAPI::Context.active_session,
178+
**kwargs
179+
)
180+
request(
181+
http_method: :get,
182+
operation: :checkouts,
183+
session: session,
184+
ids: {},
185+
params: {since_id: since_id, created_at_min: created_at_min, created_at_max: created_at_max, updated_at_min: updated_at_min, updated_at_max: updated_at_max, status: status, limit: limit}.merge(kwargs).compact,
186+
body: {},
187+
entity: nil,
188+
)
189+
end
190+
191+
end
192+
193+
end
194+
end

0 commit comments

Comments
 (0)