diff --git a/tests/snippets/bytearray.py b/tests/snippets/bytearray.py index 4f29fa187..4cda6229e 100644 --- a/tests/snippets/bytearray.py +++ b/tests/snippets/bytearray.py @@ -388,4 +388,10 @@ assert a == bytearray(b"append") assert len(a) == 6 assert a.pop() == 100 -import bytes as bbytes +# title +assert bytearray(b"Hello world").title() == bytearray(b"Hello World") +assert ( + bytearray(b"they're bill's friends from the UK").title() + == bytearray(b"They'Re Bill'S Friends From The Uk") +) + diff --git a/tests/snippets/bytes.py b/tests/snippets/bytes.py index 99de4898a..a0cc348db 100644 --- a/tests/snippets/bytes.py +++ b/tests/snippets/bytes.py @@ -178,7 +178,6 @@ assert b"kok".center(5, bytearray(b"x")) == b"xkokx" b"kok".center(-5) == b"kok" - # ljust assert [b"koki".ljust(i, b"|") for i in range(3, 10)] == [ b"koki", @@ -577,9 +576,15 @@ assert b"42".zfill(1) == b"42" assert b"42".zfill(-1) == b"42" # replace -assert b"123456789123".replace(b"23", b"XX") == b'1XX4567891XX' -assert b"123456789123".replace(b"23", b"XX", 1) == b'1XX456789123' +assert b"123456789123".replace(b"23", b"XX") == b"1XX4567891XX" +assert b"123456789123".replace(b"23", b"XX", 1) == b"1XX456789123" assert b"123456789123".replace(b"23", b"XX", 0) == b"123456789123" -assert b"123456789123".replace(b"23", b"XX", -1) == b'1XX4567891XX' +assert b"123456789123".replace(b"23", b"XX", -1) == b"1XX4567891XX" assert b"123456789123".replace(b"23", b"") == b"14567891" +# title +assert b"Hello world".title() == b"Hello World" +assert ( + b"they're bill's friends from the UK".title() + == b"They'Re Bill'S Friends From The Uk" +) diff --git a/vm/src/obj/objbytearray.rs b/vm/src/obj/objbytearray.rs index 433624339..75c817ac8 100644 --- a/vm/src/obj/objbytearray.rs +++ b/vm/src/obj/objbytearray.rs @@ -364,6 +364,7 @@ impl PyByteArrayRef { .push(x.as_bigint().byte_or(vm)?); Ok(()) } + #[pymethod(name = "pop")] fn pop(self, vm: &VirtualMachine) -> PyResult { let bytes = &mut self.inner.borrow_mut().elements; @@ -371,6 +372,11 @@ impl PyByteArrayRef { .pop() .ok_or_else(|| vm.new_index_error("pop from empty bytearray".to_string())) } + + #[pymethod(name = "title")] + fn title(self, vm: &VirtualMachine) -> PyResult { + Ok(vm.ctx.new_bytearray(self.inner.borrow().title())) + } } // fn set_value(obj: &PyObjectRef, value: Vec) { diff --git a/vm/src/obj/objbyteinner.rs b/vm/src/obj/objbyteinner.rs index 89e483bbc..16b371309 100644 --- a/vm/src/obj/objbyteinner.rs +++ b/vm/src/obj/objbyteinner.rs @@ -975,6 +975,30 @@ impl PyByteInner { Ok(res) } + + pub fn title(&self) -> Vec { + let mut res = vec![]; + let mut spaced = true; + + for i in self.elements.iter() { + match i { + 65..=90 | 97..=122 => { + if spaced { + res.push(i.to_ascii_uppercase()); + spaced = false + } else { + res.push(i.to_ascii_lowercase()); + } + } + _ => { + res.push(*i); + spaced = true + } + } + } + + res + } } pub fn try_as_byte(obj: &PyObjectRef) -> Option> { diff --git a/vm/src/obj/objbytes.rs b/vm/src/obj/objbytes.rs index 8aca62646..7b8082b52 100644 --- a/vm/src/obj/objbytes.rs +++ b/vm/src/obj/objbytes.rs @@ -402,6 +402,11 @@ impl PyBytesRef { ) -> PyResult { Ok(vm.ctx.new_bytes(self.inner.replace(old, new, count)?)) } + + #[pymethod(name = "title")] + fn title(self, vm: &VirtualMachine) -> PyResult { + Ok(vm.ctx.new_bytes(self.inner.title())) + } } #[pyclass]