Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2449 commits
Select commit Hold shift + click to select a range
3a15ff5
Merge branch 'release-1.38.35'
aws-sdk-python-automation Jun 11, 2025
3e3d9b8
Merge branch 'release-1.38.36'
aws-sdk-python-automation Jun 12, 2025
1c572cd
Merge branch 'release-1.38.37'
aws-sdk-python-automation Jun 16, 2025
f23a421
Merge branch 'release-1.38.38'
aws-sdk-python-automation Jun 17, 2025
c40e2b3
Merge branch 'release-1.38.39'
aws-sdk-python-automation Jun 18, 2025
1b5c96f
Merge branch 'release-1.38.40'
aws-sdk-python-automation Jun 19, 2025
7699cd4
Merge branch 'release-1.38.41'
aws-sdk-python-automation Jun 20, 2025
3ff0f3d
Merge branch 'release-1.38.42'
aws-sdk-python-automation Jun 23, 2025
863c862
Merge branch 'release-1.38.43'
aws-sdk-python-automation Jun 24, 2025
308ad25
Merge branch 'release-1.38.44'
aws-sdk-python-automation Jun 25, 2025
f4773c5
Merge branch 'release-1.38.45'
aws-sdk-python-automation Jun 26, 2025
e3970ab
Merge branch 'release-1.38.46'
aws-sdk-python-automation Jun 27, 2025
9c42373
Merge branch 'release-1.39.0'
aws-sdk-python-automation Jun 30, 2025
d722eb5
Merge branch 'release-1.39.1'
aws-sdk-python-automation Jul 1, 2025
0eef902
Merge branch 'release-1.39.2'
aws-sdk-python-automation Jul 2, 2025
b123641
Merge branch 'release-1.39.3'
aws-sdk-python-automation Jul 3, 2025
040eab8
Merge branch 'release-1.39.4'
aws-sdk-python-automation Jul 9, 2025
5db0907
Merge branch 'release-1.39.5'
aws-sdk-python-automation Jul 15, 2025
828533b
Merge branch 'release-1.39.6'
aws-sdk-python-automation Jul 16, 2025
4920825
Merge branch 'release-1.39.7'
aws-sdk-python-automation Jul 16, 2025
e4a87a9
Merge branch 'release-1.39.8'
aws-sdk-python-automation Jul 17, 2025
67b8999
Merge branch 'release-1.39.9'
aws-sdk-python-automation Jul 18, 2025
df1603e
Merge branch 'release-1.39.10'
aws-sdk-python-automation Jul 21, 2025
52eff0d
Merge branch 'release-1.39.11'
aws-sdk-python-automation Jul 22, 2025
b3ec877
Merge branch 'release-1.39.12'
aws-sdk-python-automation Jul 23, 2025
5e39d48
Merge branch 'release-1.39.13'
aws-sdk-python-automation Jul 24, 2025
400edf2
Merge branch 'release-1.39.14'
aws-sdk-python-automation Jul 25, 2025
071aebf
Merge branch 'release-1.39.15'
aws-sdk-python-automation Jul 28, 2025
4239a1d
Merge branch 'release-1.39.16'
aws-sdk-python-automation Jul 29, 2025
3254807
Merge branch 'release-1.39.17'
aws-sdk-python-automation Jul 30, 2025
a3bbf61
Merge branch 'release-1.40.0'
aws-sdk-python-automation Jul 31, 2025
5fed6e5
Merge branch 'release-1.40.1'
aws-sdk-python-automation Aug 1, 2025
98c9921
Merge branch 'release-1.40.2'
aws-sdk-python-automation Aug 4, 2025
21afbfc
Merge branch 'release-1.40.3'
aws-sdk-python-automation Aug 5, 2025
3594ee3
Merge branch 'release-1.40.4'
aws-sdk-python-automation Aug 6, 2025
8a1acfd
Merge branch 'release-1.40.5'
aws-sdk-python-automation Aug 7, 2025
63db11e
Merge branch 'release-1.40.6'
aws-sdk-python-automation Aug 8, 2025
9e97196
Merge branch 'release-1.40.7'
aws-sdk-python-automation Aug 11, 2025
c8dd2be
Merge branch 'release-1.40.8'
aws-sdk-python-automation Aug 12, 2025
7de1c71
Merge branch 'release-1.40.9'
aws-sdk-python-automation Aug 13, 2025
d899e22
Merge branch 'release-1.40.10'
aws-sdk-python-automation Aug 14, 2025
35c8e8c
Merge branch 'release-1.40.11'
aws-sdk-python-automation Aug 15, 2025
4da9b03
Merge branch 'release-1.40.12'
aws-sdk-python-automation Aug 18, 2025
5c7cdd3
Merge branch 'release-1.40.13'
aws-sdk-python-automation Aug 19, 2025
f0b3e82
Merge branch 'release-1.40.14'
aws-sdk-python-automation Aug 20, 2025
2d3b8f9
Merge branch 'release-1.40.15'
aws-sdk-python-automation Aug 21, 2025
56a479a
Merge branch 'release-1.40.16'
aws-sdk-python-automation Aug 22, 2025
b1b06fe
Merge branch 'release-1.40.17'
aws-sdk-python-automation Aug 25, 2025
d409c9b
Merge branch 'release-1.40.18'
aws-sdk-python-automation Aug 26, 2025
de0e6a2
Merge branch 'release-1.40.19'
aws-sdk-python-automation Aug 27, 2025
c870f2c
Merge branch 'release-1.40.20'
aws-sdk-python-automation Aug 28, 2025
0195f4a
Merge branch 'release-1.40.21'
aws-sdk-python-automation Aug 29, 2025
8e13eda
Merge branch 'release-1.40.22'
aws-sdk-python-automation Sep 2, 2025
cbb2c9c
Merge branch 'release-1.40.23'
aws-sdk-python-automation Sep 3, 2025
6bb189b
Merge branch 'release-1.40.24'
aws-sdk-python-automation Sep 4, 2025
27db68b
Merge branch 'release-1.40.25'
aws-sdk-python-automation Sep 5, 2025
9e8135a
Merge branch 'release-1.40.26'
aws-sdk-python-automation Sep 8, 2025
1449771
Merge branch 'release-1.40.27'
aws-sdk-python-automation Sep 9, 2025
95c2082
Merge branch 'release-1.40.28'
aws-sdk-python-automation Sep 10, 2025
160fbaa
Merge branch 'release-1.40.29'
aws-sdk-python-automation Sep 11, 2025
dcd9991
Merge branch 'release-1.40.30'
aws-sdk-python-automation Sep 12, 2025
b66e8cf
Merge branch 'release-1.40.31'
aws-sdk-python-automation Sep 15, 2025
44da1ad
Merge branch 'release-1.40.32'
aws-sdk-python-automation Sep 16, 2025
24b0557
Merge branch 'release-1.40.33'
aws-sdk-python-automation Sep 17, 2025
c198e2c
Merge branch 'release-1.40.34'
aws-sdk-python-automation Sep 18, 2025
331de65
Merge branch 'release-1.40.35'
aws-sdk-python-automation Sep 19, 2025
28c3ae2
Merge branch 'release-1.40.36'
aws-sdk-python-automation Sep 22, 2025
66d1f13
Merge branch 'release-1.40.37'
aws-sdk-python-automation Sep 23, 2025
5d252f6
Merge branch 'release-1.40.38'
aws-sdk-python-automation Sep 24, 2025
52dfbc2
Merge branch 'release-1.40.39'
aws-sdk-python-automation Sep 25, 2025
dc5ce63
Merge branch 'release-1.40.40'
aws-sdk-python-automation Sep 26, 2025
9f435e4
Merge branch 'release-1.40.41'
aws-sdk-python-automation Sep 29, 2025
74bd169
Merge branch 'release-1.40.42'
aws-sdk-python-automation Sep 30, 2025
8a00219
Merge branch 'release-1.40.43'
aws-sdk-python-automation Oct 1, 2025
426d4b3
Merge branch 'release-1.40.44'
aws-sdk-python-automation Oct 2, 2025
5ce2bc5
Merge branch 'release-1.40.45'
aws-sdk-python-automation Oct 3, 2025
3784dde
Merge branch 'release-1.40.46'
aws-sdk-python-automation Oct 6, 2025
2ca91ad
Merge branch 'release-1.40.47'
aws-sdk-python-automation Oct 7, 2025
9fbad5a
Merge branch 'release-1.40.48'
aws-sdk-python-automation Oct 8, 2025
dc8eb09
Merge branch 'release-1.40.49'
aws-sdk-python-automation Oct 9, 2025
c2ea08e
Merge branch 'release-1.40.50'
aws-sdk-python-automation Oct 10, 2025
d275003
Merge branch 'release-1.40.51'
aws-sdk-python-automation Oct 13, 2025
5630f31
Merge branch 'release-1.40.52'
aws-sdk-python-automation Oct 14, 2025
a0f9cb4
Merge branch 'release-1.40.53'
aws-sdk-python-automation Oct 15, 2025
03982ad
Merge branch 'release-1.40.54'
aws-sdk-python-automation Oct 16, 2025
9bc6c28
Merge branch 'release-1.40.55'
aws-sdk-python-automation Oct 17, 2025
abebe36
Merge branch 'release-1.40.56'
aws-sdk-python-automation Oct 21, 2025
be7e4d9
Merge branch 'release-1.40.57'
aws-sdk-python-automation Oct 22, 2025
6bedfc1
Merge branch 'release-1.40.58'
aws-sdk-python-automation Oct 23, 2025
665b7c4
Merge branch 'release-1.40.59'
aws-sdk-python-automation Oct 24, 2025
9636e61
Merge branch 'release-1.40.60'
aws-sdk-python-automation Oct 27, 2025
28ff8c7
Merge branch 'release-1.40.61'
aws-sdk-python-automation Oct 28, 2025
68e4960
Merge branch 'release-1.40.62'
aws-sdk-python-automation Oct 29, 2025
cf26740
Merge branch 'release-1.40.63'
aws-sdk-python-automation Oct 30, 2025
11d0051
Merge branch 'release-1.40.64'
aws-sdk-python-automation Oct 31, 2025
7b47532
Merge branch 'release-1.40.65'
aws-sdk-python-automation Nov 3, 2025
65bc39a
Merge branch 'release-1.40.66'
aws-sdk-python-automation Nov 4, 2025
51ab00a
Merge branch 'release-1.40.67'
aws-sdk-python-automation Nov 5, 2025
c6c184d
Merge branch 'release-1.40.68'
aws-sdk-python-automation Nov 6, 2025
f420535
Merge branch 'release-1.40.69'
aws-sdk-python-automation Nov 7, 2025
30b7f49
Merge branch 'release-1.40.70'
aws-sdk-python-automation Nov 10, 2025
c5893aa
Merge branch 'release-1.40.71'
aws-sdk-python-automation Nov 11, 2025
552124e
Merge branch 'release-1.40.72'
aws-sdk-python-automation Nov 12, 2025
f95e535
Merge branch 'release-1.40.73'
aws-sdk-python-automation Nov 13, 2025
8dfa4fe
Merge branch 'release-1.40.74'
aws-sdk-python-automation Nov 14, 2025
e325f9e
Merge branch 'release-1.40.75'
aws-sdk-python-automation Nov 17, 2025
b345fd6
Merge branch 'release-1.40.76'
aws-sdk-python-automation Nov 18, 2025
afda316
Merge branch 'release-1.41.0'
aws-sdk-python-automation Nov 19, 2025
d67dd73
Merge branch 'release-1.41.1'
aws-sdk-python-automation Nov 20, 2025
b651756
Merge branch 'release-1.41.2'
aws-sdk-python-automation Nov 21, 2025
154efda
Merge branch 'release-1.41.3'
aws-sdk-python-automation Nov 24, 2025
6b9e761
Merge branch 'release-1.41.4'
aws-sdk-python-automation Nov 25, 2025
9fda087
Merge branch 'release-1.41.5'
aws-sdk-python-automation Nov 26, 2025
5f17732
Merge branch 'release-1.41.6'
aws-sdk-python-automation Dec 1, 2025
dd227da
Merge branch 'release-1.42.1'
aws-sdk-python-automation Dec 2, 2025
b287796
Merge branch 'release-1.42.2'
aws-sdk-python-automation Dec 3, 2025
b71ae76
Merge branch 'release-1.42.3'
aws-sdk-python-automation Dec 4, 2025
05bdcec
Merge branch 'release-1.42.4'
aws-sdk-python-automation Dec 5, 2025
23cd566
Merge branch 'release-1.42.5'
aws-sdk-python-automation Dec 8, 2025
4dbcdb6
Merge branch 'release-1.42.6'
aws-sdk-python-automation Dec 9, 2025
a9d520e
Merge branch 'release-1.42.7'
aws-sdk-python-automation Dec 10, 2025
517a891
Merge branch 'release-1.42.8'
aws-sdk-python-automation Dec 11, 2025
fefef10
Merge branch 'release-1.42.9'
aws-sdk-python-automation Dec 12, 2025
ab29acf
Merge branch 'release-1.42.10'
aws-sdk-python-automation Dec 15, 2025
deae31c
Merge branch 'release-1.42.11'
aws-sdk-python-automation Dec 16, 2025
76d67dd
Merge branch 'release-1.42.12'
aws-sdk-python-automation Dec 17, 2025
d7832ca
Merge branch 'release-1.42.13'
aws-sdk-python-automation Dec 18, 2025
970b997
Merge branch 'release-1.42.14'
aws-sdk-python-automation Dec 19, 2025
dafce6f
Merge branch 'release-1.42.15'
aws-sdk-python-automation Dec 22, 2025
d8a1f97
Merge branch 'release-1.42.16'
aws-sdk-python-automation Dec 23, 2025
d67a9c4
Merge branch 'release-1.42.17'
aws-sdk-python-automation Dec 26, 2025
c8f4f63
Merge branch 'release-1.42.18'
aws-sdk-python-automation Dec 29, 2025
5e019fa
Merge branch 'release-1.42.19'
aws-sdk-python-automation Dec 30, 2025
b8ff014
Merge branch 'release-1.42.20'
aws-sdk-python-automation Jan 2, 2026
00fb87d
Merge branch 'release-1.42.21'
aws-sdk-python-automation Jan 2, 2026
6c64e2c
Merge branch 'release-1.42.22'
aws-sdk-python-automation Jan 5, 2026
f6e3237
Merge branch 'release-1.42.23'
aws-sdk-python-automation Jan 6, 2026
331cd66
Merge branch 'release-1.42.24'
aws-sdk-python-automation Jan 7, 2026
a35f376
Merge branch 'release-1.42.25'
aws-sdk-python-automation Jan 9, 2026
526feac
Merge branch 'release-1.42.26'
aws-sdk-python-automation Jan 12, 2026
c7688c2
Merge branch 'release-1.42.27'
aws-sdk-python-automation Jan 13, 2026
10cfc3a
Merge branch 'release-1.42.28'
aws-sdk-python-automation Jan 14, 2026
b64df2f
Merge branch 'release-1.42.29'
aws-sdk-python-automation Jan 15, 2026
279b5b6
Merge branch 'release-1.42.30'
aws-sdk-python-automation Jan 16, 2026
c365557
Merge branch 'release-1.42.31'
aws-sdk-python-automation Jan 20, 2026
3549e01
Merge branch 'release-1.42.32'
aws-sdk-python-automation Jan 21, 2026
b9ed58f
Merge branch 'release-1.42.33'
aws-sdk-python-automation Jan 22, 2026
d52e6ce
Merge branch 'release-1.42.34'
aws-sdk-python-automation Jan 23, 2026
bd0f61b
Merge branch 'release-1.42.35'
aws-sdk-python-automation Jan 26, 2026
6d639f1
Merge branch 'release-1.42.36'
aws-sdk-python-automation Jan 27, 2026
51455c2
Merge branch 'release-1.42.37'
aws-sdk-python-automation Jan 28, 2026
0b51aea
Merge branch 'release-1.42.38'
aws-sdk-python-automation Jan 29, 2026
26a688f
Merge branch 'release-1.42.39'
aws-sdk-python-automation Jan 30, 2026
12d57f6
Merge branch 'release-1.42.40'
aws-sdk-python-automation Feb 2, 2026
104e8ef
Merge branch 'release-1.42.41'
aws-sdk-python-automation Feb 3, 2026
b02439f
Merge branch 'release-1.42.42'
aws-sdk-python-automation Feb 4, 2026
7c51a6d
Merge branch 'release-1.42.43'
aws-sdk-python-automation Feb 5, 2026
77d291c
Merge branch 'release-1.42.44'
aws-sdk-python-automation Feb 6, 2026
d7d1a54
Merge branch 'release-1.42.45'
aws-sdk-python-automation Feb 9, 2026
56b6d8c
Merge branch 'release-1.42.46'
aws-sdk-python-automation Feb 10, 2026
b182891
Merge branch 'release-1.42.47'
aws-sdk-python-automation Feb 11, 2026
504b9a3
Merge branch 'release-1.42.48'
aws-sdk-python-automation Feb 12, 2026
986db6c
Merge branch 'release-1.42.49'
aws-sdk-python-automation Feb 13, 2026
11d0644
Merge branch 'release-1.42.50'
aws-sdk-python-automation Feb 16, 2026
9d9af73
Merge branch 'release-1.42.51'
aws-sdk-python-automation Feb 17, 2026
7cdfafa
Merge branch 'release-1.42.52'
aws-sdk-python-automation Feb 18, 2026
de615b8
Merge branch 'release-1.42.53'
aws-sdk-python-automation Feb 19, 2026
b4cc476
Merge branch 'release-1.42.54'
aws-sdk-python-automation Feb 20, 2026
59176e1
Merge branch 'release-1.42.55'
aws-sdk-python-automation Feb 23, 2026
b6a65cb
Merge branch 'release-1.42.56'
aws-sdk-python-automation Feb 24, 2026
86d9ec3
Merge branch 'release-1.42.57'
aws-sdk-python-automation Feb 25, 2026
f76046b
Merge branch 'release-1.42.58'
aws-sdk-python-automation Feb 26, 2026
c204bb1
Merge branch 'release-1.42.59'
aws-sdk-python-automation Feb 27, 2026
ec3b3e3
Merge branch 'release-1.42.60'
aws-sdk-python-automation Mar 3, 2026
91f8bd7
Merge branch 'release-1.42.61'
aws-sdk-python-automation Mar 4, 2026
d66a4ce
Merge branch 'release-1.42.62'
aws-sdk-python-automation Mar 5, 2026
053383c
Merge branch 'release-1.42.63'
aws-sdk-python-automation Mar 6, 2026
dc6194d
Merge branch 'release-1.42.64'
aws-sdk-python-automation Mar 9, 2026
9ed5c2f
Merge branch 'release-1.42.65'
aws-sdk-python-automation Mar 10, 2026
537c33e
Merge branch 'release-1.42.66'
aws-sdk-python-automation Mar 11, 2026
946ffef
Merge branch 'release-1.42.67'
aws-sdk-python-automation Mar 12, 2026
7a0027d
Merge branch 'release-1.42.68'
aws-sdk-python-automation Mar 13, 2026
dac0d1b
Merge branch 'release-1.42.69'
aws-sdk-python-automation Mar 16, 2026
bda7d02
Merge branch 'release-1.42.70'
aws-sdk-python-automation Mar 17, 2026
0fa4e01
Merge branch 'release-1.42.71'
aws-sdk-python-automation Mar 18, 2026
9a8fcce
Merge branch 'release-1.42.72'
aws-sdk-python-automation Mar 19, 2026
08d494a
Merge branch 'release-1.42.73'
aws-sdk-python-automation Mar 20, 2026
b18efcc
Merge branch 'release-1.42.74'
aws-sdk-python-automation Mar 23, 2026
cfa4484
Merge branch 'release-1.42.75'
aws-sdk-python-automation Mar 24, 2026
eded7ce
Merge branch 'release-1.42.76'
aws-sdk-python-automation Mar 25, 2026
a42e6cf
Merge branch 'release-1.42.77'
aws-sdk-python-automation Mar 26, 2026
08282cd
Merge branch 'release-1.42.78'
aws-sdk-python-automation Mar 27, 2026
99ac865
Merge branch 'release-1.42.79'
aws-sdk-python-automation Mar 30, 2026
080f45a
Merge branch 'release-1.42.80'
aws-sdk-python-automation Mar 31, 2026
56a6ef8
Merge branch 'release-1.42.81'
aws-sdk-python-automation Apr 1, 2026
d3423de
Merge branch 'release-1.42.82'
aws-sdk-python-automation Apr 2, 2026
da27682
Merge branch 'release-1.42.83'
aws-sdk-python-automation Apr 3, 2026
0bb499c
Merge branch 'release-1.42.84'
aws-sdk-python-automation Apr 6, 2026
0db1752
Merge branch 'release-1.42.85'
aws-sdk-python-automation Apr 7, 2026
d831a06
Merge branch 'release-1.42.86'
aws-sdk-python-automation Apr 8, 2026
215aec9
Merge branch 'release-1.42.87'
aws-sdk-python-automation Apr 9, 2026
974e23f
Merge branch 'release-1.42.88'
aws-sdk-python-automation Apr 10, 2026
9b76a62
Merge branch 'release-1.42.89'
aws-sdk-python-automation Apr 13, 2026
8cde7ca
Merge branch 'release-1.42.90'
aws-sdk-python-automation Apr 16, 2026
2da0705
Merge branch 'release-1.42.91'
aws-sdk-python-automation Apr 17, 2026
20bd7a8
Merge branch 'release-1.42.92'
aws-sdk-python-automation Apr 20, 2026
fd8b312
Merge branch 'release-1.42.93'
aws-sdk-python-automation Apr 21, 2026
9e0cd69
Merge branch 'release-1.42.94'
aws-sdk-python-automation Apr 22, 2026
0aaee4d
Merge branch 'release-1.42.95'
aws-sdk-python-automation Apr 23, 2026
435c9a3
Merge branch 'release-1.42.96'
aws-sdk-python-automation Apr 24, 2026
9131bfc
Merge branch 'release-1.42.97'
aws-sdk-python-automation Apr 27, 2026
05dafea
Merge branch 'release-1.43.0'
aws-sdk-python-automation Apr 29, 2026
7084f04
Merge branch 'release-1.43.1'
aws-sdk-python-automation Apr 30, 2026
6338dda
Merge branch 'release-1.43.2'
aws-sdk-python-automation May 1, 2026
f687cc7
Merge branch 'release-1.43.3'
aws-sdk-python-automation May 4, 2026
2d415ea
Merge branch 'release-1.43.4'
aws-sdk-python-automation May 5, 2026
7068f3e
Merge branch 'release-1.43.5'
aws-sdk-python-automation May 6, 2026
4fa2154
Merge branch 'release-1.43.6'
aws-sdk-python-automation May 7, 2026
74501ce
Merge branch 'release-1.43.7'
aws-sdk-python-automation May 13, 2026
bd1fb23
Merge branch 'release-1.43.8'
aws-sdk-python-automation May 14, 2026
994b6d7
Merge branch 'release-1.43.9'
aws-sdk-python-automation May 15, 2026
faaa928
Merge branch 'release-1.43.10'
aws-sdk-python-automation May 18, 2026
7f1dfc4
Merge branch 'release-1.43.11'
aws-sdk-python-automation May 19, 2026
2d725f1
Merge branch 'release-1.43.12'
aws-sdk-python-automation May 20, 2026
8bd61f7
Merge branch 'release-1.43.13'
aws-sdk-python-automation May 21, 2026
f23ff3b
Merge branch 'release-1.43.14'
aws-sdk-python-automation May 22, 2026
e7ba6b5
Merge branch 'release-1.43.15'
aws-sdk-python-automation May 26, 2026
0a7d573
Merge branch 'release-1.43.16'
aws-sdk-python-automation May 27, 2026
364f281
Merge branch 'release-1.43.17'
aws-sdk-python-automation May 28, 2026
96246a7
Merge branch 'release-1.43.18'
aws-sdk-python-automation May 29, 2026
8fdb47d
Merge branch 'release-1.43.19'
aws-sdk-python-automation Jun 1, 2026
250cdcc
Merge branch 'release-1.43.20'
aws-sdk-python-automation Jun 2, 2026
016da4b
Merge branch 'release-1.43.21'
aws-sdk-python-automation Jun 3, 2026
d1b7760
Merge branch 'release-1.43.22'
aws-sdk-python-automation Jun 3, 2026
fb8102b
Merge branch 'release-1.43.23'
aws-sdk-python-automation Jun 4, 2026
f949c25
Merge branch 'release-1.43.24'
aws-sdk-python-automation Jun 5, 2026
a09b615
Merge branch 'release-1.43.25'
aws-sdk-python-automation Jun 8, 2026
6ed7218
Merge branch 'release-1.43.26'
aws-sdk-python-automation Jun 9, 2026
0ffcb23
Merge branch 'release-1.43.27'
aws-sdk-python-automation Jun 10, 2026
b3f27bf
Merge branch 'release-1.43.28'
aws-sdk-python-automation Jun 11, 2026
77da2d8
Merge branch 'release-1.43.29'
aws-sdk-python-automation Jun 12, 2026
c3a7b1c
Merge branch 'release-1.43.30'
aws-sdk-python-automation Jun 15, 2026
6eba456
test: replace dateutil.tz.tzlocal
miketheman Feb 6, 2026
99b9a80
refactor: replace dateutil.tz.tzlocal
miketheman May 25, 2026
ddec238
test: replace usages of dateutil.tz.tzutc
miketheman May 25, 2026
c70be79
refactor: replace dateutil.tz.tzutc with stdlib
miketheman May 25, 2026
5adb04d
test: use consistent datetime fixtures in s3express
miketheman May 26, 2026
99cd4f1
test: replace dateutil.parser with stdlib
miketheman May 25, 2026
91e8878
refactor: replace dateutil.parser with stdlib
miketheman May 25, 2026
aead776
chore(deps): remove unused python-dateutil
miketheman May 25, 2026
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
55 changes: 46 additions & 9 deletions botocore/compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@

from botocore.vendored import six
from botocore.exceptions import MD5UnavailableError

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Discussion point]

Starting off with my biggest comment:

We have a specification for what accepted timestamp shapes are, so we should only ever need to accept those for parsing. This PR properly handles all officially supported datetime formats, so theoretically this is a fully safe change to make despite handling fewer formats than dateutil.

There are still a few places that I'm still concerned about breaking:

  1. AWS services that are incorrectly returning these values which botocore accepts
  2. Non-AWS third party services relying on botocore's overly permissive behavior

It's a bad thing that botocore is so permissive. We have seen AWS service teams test their service with other datetime formats against botocore and seen it work, then be surprised when the same datetime format broke the Java SDK. If we ever want to tighten up this behavior, we have to rip the bandaid off at some point or fully commit to supporting this forever.

One way we could make this a little more cautiously is to start by using this new code path first and emitting a warning when we have to fall back to the old one, then ripping out the legacy path in three months with a minor version bump. What do you think?

from dateutil.tz import tzlocal
from urllib3 import exceptions

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -269,15 +268,53 @@ def _windows_shell_split(s):


def get_tzinfo_options():
# Due to dateutil/dateutil#197, Windows may fail to parse times in the past
# with the system clock. We can alternatively fallback to tzwininfo when
# this happens, which will get time info from the Windows registry.
if sys.platform == 'win32':
from dateutil.tz import tzwinlocal
# Historical compatibility shim for tzinfo options.
# Previously had to use the third party `dateutil` library to get tzinfo objects,
# but now that botocore require Python 3.10+, use the built in tzinfo support.
# TODO: Remove this function and implement directly in the codebase,
# and simplify since there's now only a single option.
return (datetime.datetime.now().astimezone().tzinfo,)

return (tzlocal, tzwinlocal)
else:
return (tzlocal,)

_ISO_ZONE_SUFFIX_RE = re.compile(r"\s*(Z|UTC|GMT)$", re.IGNORECASE)
_ISO_COMPACT_RE = re.compile(
r"^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2}(?:\.\d+)?)?"
)
_ISO_SPACE_SEPARATOR_RE = re.compile(
r"^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})"
)
_ISO_OFFSET_NO_COLON_RE = re.compile(r"\s*([+-])(\d{2})(\d{2})$")
_ISO_FRACTIONAL_SECONDS_RE = re.compile(r"\.(\d+)")


def _normalize_iso8601_for_python_310(value):
"""Normalize an ISO 8601 string into a shape Python 3.10's strict
``datetime.fromisoformat`` accepts. Python 3.11+ accepts these shapes
natively.

Handled: ``Z``/``UTC``/``GMT`` zone suffixes (any case, with optional
leading whitespace), compact basic form ``YYYYMMDDTHHMM[SS]``,
space-separated date and time, tz offsets without a colon
(``+HHMM``), and fractional seconds with anything other than 3 or 6
digits.

Drop this helper and its call sites when 3.10 support ends.
"""
value = _ISO_ZONE_SUFFIX_RE.sub("+00:00", value)
compact = _ISO_COMPACT_RE.match(value)
if compact:
y, mo, d, h, mi, s = compact.groups()
value = (
f"{y}-{mo}-{d}T{h}:{mi}:{s or '00'}{value[compact.end():]}"
)
value = _ISO_SPACE_SEPARATOR_RE.sub(r"\1T\2", value)
value = _ISO_OFFSET_NO_COLON_RE.sub(r"\1\2:\3", value)
value = _ISO_FRACTIONAL_SECONDS_RE.sub(
lambda m: "." + m.group(1).ljust(6, "0")[:6],
value,
count=1,
)
return value


# Detect if CRT is available for use
Expand Down
29 changes: 17 additions & 12 deletions botocore/credentials.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,12 @@
from copy import deepcopy
from hashlib import sha1, sha256

import dateutil.parser
from dateutil.parser import parse
from dateutil.tz import tzlocal, tzutc

import botocore.compat
import botocore.configloader
from botocore import UNSIGNED
from botocore.compat import (
EC,
_normalize_iso8601_for_python_310,
compat_shell_split,
total_seconds,
)
Expand Down Expand Up @@ -275,13 +272,19 @@ def get_credentials(session):


def _local_now():
return datetime.datetime.now(tzlocal())
return datetime.datetime.now().astimezone()


def _parse_iso_utc(value):
return datetime.datetime.fromisoformat(
_normalize_iso8601_for_python_310(value)
)


def _parse_if_needed(value):
if isinstance(value, datetime.datetime):
return value
return parse(value)
return _parse_iso_utc(value)


def _serialize_if_needed(value, iso=False):
Expand Down Expand Up @@ -634,7 +637,7 @@ def _protected_refresh(self, is_mandatory):

@staticmethod
def _expiry_datetime(time_str):
return parse(time_str)
return _parse_iso_utc(time_str)

def _set_from_data(self, data):
expected_keys = ['access_key', 'secret_key', 'token', 'expiry_time']
Expand All @@ -653,7 +656,7 @@ def _set_from_data(self, data):
self.access_key = data['access_key']
self.secret_key = data['secret_key']
self.token = data['token']
self._expiry_time = parse(data['expiry_time'])
self._expiry_time = _parse_iso_utc(data['expiry_time'])
self.account_id = data.get('account_id')
logger.debug(
"Retrieved credentials will expire at: %s", self._expiry_time
Expand Down Expand Up @@ -1256,7 +1259,7 @@ def load(self):

expiry_time = credentials['expiry_time']
if expiry_time is not None:
expiry_time = parse(expiry_time)
expiry_time = _parse_iso_utc(expiry_time)
return RefreshableCredentials(
credentials['access_key'],
credentials['secret_key'],
Expand Down Expand Up @@ -2302,7 +2305,9 @@ def _create_cache_key(self):
def _parse_timestamp(self, timestamp_ms):
# fromtimestamp expects seconds so: milliseconds / 1000 = seconds
timestamp_seconds = timestamp_ms / 1000.0
timestamp = datetime.datetime.fromtimestamp(timestamp_seconds, tzutc())
timestamp = datetime.datetime.fromtimestamp(
timestamp_seconds, datetime.timezone.utc
)
return timestamp.strftime(self._UTC_DATE_FORMAT)

def _get_credentials(self):
Expand All @@ -2322,7 +2327,7 @@ def _get_credentials(self):
# raise an UnauthorizedSSOTokenError if the loaded legacy token
# is expired to save a call to GetRoleCredentials with an
# expired token.
expiration = dateutil.parser.parse(token_dict['expiresAt'])
expiration = _parse_iso_utc(token_dict['expiresAt'])
remaining = total_seconds(expiration - self._time_fetcher())
if remaining <= 0:
raise UnauthorizedSSOTokenError()
Expand Down Expand Up @@ -2657,7 +2662,7 @@ def refresh_credentials(self):
output = response.get('tokenOutput')

expires_timestamp = self._time_fetcher().astimezone(
tzutc()
datetime.timezone.utc
) + datetime.timedelta(seconds=output['expiresIn'])

# Overwrite token with refreshed fields
Expand Down
17 changes: 9 additions & 8 deletions botocore/tokens.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,11 @@
import logging
import os
import threading
from datetime import datetime, timedelta
from datetime import datetime, timedelta, timezone
from typing import NamedTuple

import dateutil.parser
from dateutil.tz import tzutc

from botocore import UNSIGNED
from botocore.compat import total_seconds
from botocore.compat import _normalize_iso8601_for_python_310, total_seconds
from botocore.config import Config
from botocore.exceptions import (
ClientError,
Expand All @@ -40,7 +37,11 @@


def _utc_now():
return datetime.now(tzutc())
return datetime.now(timezone.utc)


def _parse_iso_utc(value):
return datetime.fromisoformat(_normalize_iso8601_for_python_310(value))


def create_token_resolver(session):
Expand Down Expand Up @@ -295,7 +296,7 @@ def _refresh_access_token(self, token):
logger.info(msg)
return None

expiry = dateutil.parser.parse(token["registrationExpiresAt"])
expiry = _parse_iso_utc(token["registrationExpiresAt"])
if total_seconds(expiry - self._now()) <= 0:
logger.info("SSO token registration expired at %s", expiry)
return None
Expand All @@ -311,7 +312,7 @@ def _refresher(self):
session_name = self._sso_config["session_name"]
logger.info("Loading cached SSO token for %s", session_name)
token_dict = self._token_loader(start_url, session_name=session_name)
expiration = dateutil.parser.parse(token_dict["expiresAt"])
expiration = _parse_iso_utc(token_dict["expiresAt"])
logger.debug("Cached SSO token expires at %s", expiration)

remaining = total_seconds(expiration - self._now())
Expand Down
64 changes: 44 additions & 20 deletions botocore/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import binascii
import datetime
import email.message
import email.utils
import functools
import hashlib
import io
Expand All @@ -31,8 +32,6 @@
from pathlib import Path
from urllib.request import getproxies, proxy_bypass

import dateutil.parser
from dateutil.tz import tzutc
from urllib3.exceptions import LocationParseError

import botocore
Expand All @@ -54,6 +53,7 @@
UNSAFE_URL_CHARS,
ZONE_ID_PAT, # noqa: F401
OrderedDict,
_normalize_iso8601_for_python_310,
get_current_datetime,
get_md5,
get_tzinfo_options,
Expand Down Expand Up @@ -948,31 +948,55 @@ def _epoch_seconds_to_datetime(value, tzinfo):
:type value: float or int
:param value: The Unix timestamps as number.

:type tzinfo: callable
:param tzinfo: A ``datetime.tzinfo`` class or compatible callable.
:type tzinfo: datetime.tzinfo
:param tzinfo: A ``datetime.tzinfo`` instance.
"""
epoch_zero = datetime.datetime(1970, 1, 1, 0, 0, 0, tzinfo=tzutc())
epoch_zero_localized = epoch_zero.astimezone(tzinfo())
epoch_zero = datetime.datetime(
1970, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc
)
epoch_zero_localized = epoch_zero.astimezone(tzinfo)
return epoch_zero_localized + datetime.timedelta(seconds=value)


def _parse_timestamp_with_tzinfo(value, tzinfo):
"""Parse timestamp with pluggable tzinfo options."""
if isinstance(value, (int, float)):
# Possibly an epoch time.
return datetime.datetime.fromtimestamp(value, tzinfo())
return datetime.datetime.fromtimestamp(value, tzinfo)
else:
try:
return datetime.datetime.fromtimestamp(float(value), tzinfo())
return datetime.datetime.fromtimestamp(float(value), tzinfo)
except (TypeError, ValueError):
pass
if not isinstance(value, str):
raise ValueError(f'Invalid timestamp "{value}"')
# Non-numeric string. Try ISO 8601 first (the common AWS shape), then
# RFC 2822 / HTTP-date / asctime via email.utils, then a couple of
# lenient strptime fallbacks for legacy HTTP Expires-header shapes
# seen in the wild.
iso_value = _normalize_iso8601_for_python_310(value)
try:
return datetime.datetime.fromisoformat(iso_value)
except (TypeError, ValueError):
pass
# A handful of AWS shared examples have a malformed ISO hour like
# "T016:15:21" — collapse the leading zero and retry.
fixed_iso = re.sub(r"T0(\d{2}):", r"T\1:", iso_value, count=1)
if fixed_iso != iso_value:
try:
return datetime.datetime.fromisoformat(fixed_iso)
except (TypeError, ValueError):
pass
try:
# In certain cases, a timestamp marked with GMT can be parsed into a
# different time zone, so here we provide a context which will
# enforce that GMT == UTC.
return dateutil.parser.parse(value, tzinfos={'GMT': tzutc()})
except (TypeError, ValueError) as e:
raise ValueError(f'Invalid timestamp "{value}": {e}')
return email.utils.parsedate_to_datetime(value)
except (TypeError, ValueError):
pass
for fmt in ("%m/%d/%Y", "%d %b %Y"):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Question]

This catches a few non-Smithy shapes but rejects others that dateutil handled. For example, it accepts 06/25/2026 but not 2026/06/25, and 15 Jan 2026 but not January 15, 2026. Why these two formats specifically?

try:
return datetime.datetime.strptime(value.title(), fmt)
except ValueError:
continue
raise ValueError(f'Invalid timestamp "{value}"')


def parse_timestamp(value):
Expand All @@ -994,7 +1018,7 @@ def parse_timestamp(value):
except (OSError, OverflowError) as e:
logger.debug(
'Unable to parse timestamp with "%s" timezone info.',
tzinfo.__name__,
tzinfo,
exc_info=e,
)
# For numeric values attempt fallback to using fromtimestamp-free method.
Expand All @@ -1015,7 +1039,7 @@ def parse_timestamp(value):
logger.debug(
'Unable to parse timestamp using fallback method with "%s" '
'timezone info.',
tzinfo.__name__,
tzinfo,
exc_info=e,
)
raise RuntimeError(
Expand Down Expand Up @@ -1062,9 +1086,9 @@ def parse_to_aware_datetime(value):
# we should use the local time. However, to restore backwards
# compat, the previous behavior was to assume UTC, which is
# what we're going to do here.
datetime_obj = datetime_obj.replace(tzinfo=tzutc())
datetime_obj = datetime_obj.replace(tzinfo=datetime.timezone.utc)
else:
datetime_obj = datetime_obj.astimezone(tzutc())
datetime_obj = datetime_obj.astimezone(datetime.timezone.utc)
return datetime_obj


Expand All @@ -1074,14 +1098,14 @@ def datetime2timestamp(dt, default_timezone=None):
:type dt: datetime
:param dt: A datetime object to be converted into timestamp
:type default_timezone: tzinfo
:param default_timezone: If it is provided as None, we treat it as tzutc().
:param default_timezone: If it is provided as None, we treat it as UTC.
But it is only used when dt is a naive datetime.
:returns: The timestamp
"""
epoch = datetime.datetime(1970, 1, 1)
if dt.tzinfo is None:
if default_timezone is None:
default_timezone = tzutc()
default_timezone = datetime.timezone.utc
dt = dt.replace(tzinfo=default_timezone)
d = dt.replace(tzinfo=None) - dt.utcoffset() - epoch
return d.total_seconds()
Expand Down
4 changes: 1 addition & 3 deletions botocore/validate.py
Original file line number Diff line number Diff line change
Expand Up @@ -403,9 +403,7 @@ def _type_check_datetime(self, value):
try:
parse_to_aware_datetime(value)
return True
except (TypeError, ValueError, AttributeError):
# Yes, dateutil can sometimes raise an AttributeError
# when parsing timestamps.
except (TypeError, ValueError):
return False


Expand Down
1 change: 0 additions & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ universal = 0
[metadata]
requires_dist =
jmespath>=0.7.1,<2.0.0
python-dateutil>=2.1,<3.0.0
urllib3>=1.25.4,!=2.2.0,<3

[options.extras_require]
Expand Down
1 change: 0 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ def find_version(*file_paths):

requires = [
'jmespath>=0.7.1,<2.0.0',
'python-dateutil>=2.1,<3.0.0',
'urllib3>=1.25.4,!=2.2.0,<3',
]

Expand Down
Loading
Loading