Skip to content

Commit 633f291

Browse files
rwgkcopybara-github
authored andcommitted
Civil Time Unit conversions compatibility between pybind11_abseil & Google-internal Clif_PyObjAs/From implementations.
This is to support the PyCLIF-pybind11 integration. PiperOrigin-RevId: 525462353
1 parent e336d49 commit 633f291

File tree

2 files changed

+46
-17
lines changed

2 files changed

+46
-17
lines changed

pybind11_abseil/absl_casters.h

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -235,10 +235,10 @@ struct type_caster<absl::Time> {
235235
}
236236
};
237237

238-
template <typename CivilTimeType>
239-
struct absl_civil_time_caster {
238+
template <typename CivilTimeUnitType>
239+
struct absl_civil_datetime_caster {
240240
public:
241-
PYBIND11_TYPE_CASTER(CivilTimeType, const_name("CivilTimeType"));
241+
PYBIND11_TYPE_CASTER(CivilTimeUnitType, const_name("CivilDateTime"));
242242

243243
bool load(handle src, bool convert) {
244244
if (!convert || !hasattr(src, "year") || !hasattr(src, "month") ||
@@ -252,42 +252,68 @@ struct absl_civil_time_caster {
252252
minute = GetInt64Attr(src, "minute");
253253
second = GetInt64Attr(src, "second");
254254
}
255-
value = CivilTimeType(GetInt64Attr(src, "year"), GetInt64Attr(src, "month"),
255+
value =
256+
CivilTimeUnitType(GetInt64Attr(src, "year"), GetInt64Attr(src, "month"),
256257
GetInt64Attr(src, "day"), hour, minute, second);
257258
return true;
258259
}
259260

260-
static handle cast(const CivilTimeType& src, return_value_policy, handle) {
261+
static handle cast(const CivilTimeUnitType& src, return_value_policy,
262+
handle) {
261263
auto py_datetime_t = module::import("datetime").attr("datetime");
262264
auto py_datetime = py_datetime_t(src.year(), src.month(), src.day(),
263265
src.hour(), src.minute(), src.second());
264266
return py_datetime.release();
265267
}
266268
};
267269

270+
template <typename CivilTimeUnitType>
271+
struct absl_civil_date_caster {
272+
public:
273+
PYBIND11_TYPE_CASTER(CivilTimeUnitType, const_name("CivilDate"));
274+
275+
bool load(handle src, bool convert) {
276+
if (!convert || !hasattr(src, "year") || !hasattr(src, "month") ||
277+
!hasattr(src, "day")) {
278+
return false;
279+
}
280+
value =
281+
CivilTimeUnitType(GetInt64Attr(src, "year"), GetInt64Attr(src, "month"),
282+
GetInt64Attr(src, "day"));
283+
return true;
284+
}
285+
286+
static handle cast(const CivilTimeUnitType& src, return_value_policy,
287+
handle) {
288+
auto py_datetime_t = module::import("datetime").attr("date");
289+
auto py_datetime = py_datetime_t(src.year(), src.month(), src.day());
290+
return py_datetime.release();
291+
}
292+
};
293+
268294
template <>
269295
struct type_caster<absl::CivilSecond>
270-
: public absl_civil_time_caster<absl::CivilSecond> {};
296+
: public absl_civil_datetime_caster<absl::CivilSecond> {};
271297

272298
template <>
273299
struct type_caster<absl::CivilMinute>
274-
: public absl_civil_time_caster<absl::CivilMinute> {};
300+
: public absl_civil_datetime_caster<absl::CivilMinute> {};
275301

276302
template <>
277303
struct type_caster<absl::CivilHour>
278-
: public absl_civil_time_caster<absl::CivilHour> {};
304+
: public absl_civil_datetime_caster<absl::CivilHour> {};
279305

280306
template <>
281307
struct type_caster<absl::CivilDay>
282-
: public absl_civil_time_caster<absl::CivilDay> {};
308+
: public absl_civil_date_caster<absl::CivilDay> {};
283309

284310
template <>
285311
struct type_caster<absl::CivilMonth>
286-
: public absl_civil_time_caster<absl::CivilMonth> {};
312+
: public absl_civil_date_caster<absl::CivilMonth> {};
287313

288314
template <>
289315
struct type_caster<absl::CivilYear>
290-
: public absl_civil_time_caster<absl::CivilYear> {};
316+
: public absl_civil_date_caster<absl::CivilYear> {};
291317

292318
// Returns {true, a span referencing the data contained by src} without copying
293319
// or converting the data if possible. Otherwise returns {false, an empty span}.

pybind11_abseil/tests/absl_test.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,9 @@ def test_return_civilday(self):
194194
truncated = self.TEST_DATETIME.replace(
195195
hour=0, minute=0, second=0, microsecond=0)
196196
self.assertEqual(
197-
truncated,
198-
absl_example.make_civilday(self.TEST_DATETIME_UTC.timestamp()))
197+
truncated.date(),
198+
absl_example.make_civilday(self.TEST_DATETIME_UTC.timestamp()),
199+
)
199200

200201
def test_pass_datetime_as_civilday(self):
201202
truncated = self.TEST_DATETIME_UTC.replace(
@@ -207,8 +208,9 @@ def test_return_civilmonth(self):
207208
truncated = self.TEST_DATETIME.replace(
208209
day=1, hour=0, minute=0, second=0, microsecond=0)
209210
self.assertEqual(
210-
truncated,
211-
absl_example.make_civilmonth(self.TEST_DATETIME_UTC.timestamp()))
211+
truncated.date(),
212+
absl_example.make_civilmonth(self.TEST_DATETIME_UTC.timestamp()),
213+
)
212214

213215
def test_pass_datetime_as_civilmonth(self):
214216
truncated = self.TEST_DATETIME_UTC.replace(
@@ -221,8 +223,9 @@ def test_return_civilyear(self):
221223
truncated = self.TEST_DATETIME.replace(
222224
month=1, day=1, hour=0, minute=0, second=0, microsecond=0)
223225
self.assertEqual(
224-
truncated,
225-
absl_example.make_civilyear(self.TEST_DATETIME_UTC.timestamp()))
226+
truncated.date(),
227+
absl_example.make_civilyear(self.TEST_DATETIME_UTC.timestamp()),
228+
)
226229

227230
def test_pass_datetime_as_civilyear(self):
228231
truncated = self.TEST_DATETIME_UTC.replace(

0 commit comments

Comments
 (0)