Skip to content

Commit 56604f9

Browse files
committed
Implement string module constants
1 parent 950dbd1 commit 56604f9

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

tests/snippets/test_string.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import string
2+
3+
4+
assert string.ascii_letters == 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
5+
assert string.ascii_lowercase == 'abcdefghijklmnopqrstuvwxyz'
6+
assert string.ascii_uppercase == 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
7+
assert string.digits == '0123456789'
8+
assert string.hexdigits == '0123456789abcdefABCDEF'
9+
assert string.octdigits == '01234567'
10+
assert string.printable == '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
11+
assert string.punctuation == '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
12+
assert string.whitespace == ' \t\n\r\x0b\x0c'

vm/src/stdlib/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ mod math;
66
mod pystruct;
77
mod random;
88
mod re;
9+
mod string;
910
mod time_module;
1011
mod tokenize;
1112
mod types;
@@ -25,6 +26,7 @@ pub fn get_module_inits() -> HashMap<String, StdlibInitFunc> {
2526
modules.insert("math".to_string(), math::mk_module as StdlibInitFunc);
2627
modules.insert("re".to_string(), re::mk_module as StdlibInitFunc);
2728
modules.insert("random".to_string(), random::mk_module as StdlibInitFunc);
29+
modules.insert("string".to_string(), string::mk_module as StdlibInitFunc);
2830
modules.insert("struct".to_string(), pystruct::mk_module as StdlibInitFunc);
2931
modules.insert("time".to_string(), time_module::mk_module as StdlibInitFunc);
3032
modules.insert(

vm/src/stdlib/string.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/* String builtin module
2+
*
3+
*
4+
*/
5+
6+
use super::super::pyobject::{PyContext, PyObjectRef};
7+
8+
pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
9+
let py_mod = ctx.new_module(&"string".to_string(), ctx.new_scope(None));
10+
11+
let ascii_lowercase = "abcdefghijklmnopqrstuvwxyz".to_string();
12+
let ascii_uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".to_string();
13+
let ascii_letters = format!("{}{}", ascii_lowercase, ascii_uppercase);
14+
let digits = "0123456789".to_string();
15+
let hexdigits = "0123456789abcdefABCDEF".to_string();
16+
let octdigits = "01234567".to_string();
17+
let punctuation = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~".to_string();
18+
let whitespace = " \t\n\r\x0b\x0c".to_string();
19+
let printable = format!("{}{}{}{}", digits, ascii_letters, punctuation, whitespace);
20+
21+
// Constants:
22+
ctx.set_attr(&py_mod, "ascii_letters", ctx.new_str(ascii_letters.clone()));
23+
ctx.set_attr(
24+
&py_mod,
25+
"ascii_lowercase",
26+
ctx.new_str(ascii_lowercase.clone()),
27+
);
28+
ctx.set_attr(
29+
&py_mod,
30+
"ascii_uppercase",
31+
ctx.new_str(ascii_uppercase.clone()),
32+
);
33+
ctx.set_attr(&py_mod, "digits", ctx.new_str(digits.clone()));
34+
ctx.set_attr(&py_mod, "hexdigits", ctx.new_str(hexdigits.clone()));
35+
ctx.set_attr(&py_mod, "octdigits", ctx.new_str(octdigits.clone()));
36+
ctx.set_attr(&py_mod, "printable", ctx.new_str(printable.clone()));
37+
ctx.set_attr(&py_mod, "punctuation", ctx.new_str(punctuation.clone()));
38+
ctx.set_attr(&py_mod, "whitespace", ctx.new_str(whitespace.clone()));
39+
40+
py_mod
41+
}

0 commit comments

Comments
 (0)