Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]

### Added
- **Datetime Module Runtime Implementation** (Issue #32)
- Full runtime support for `datetime` module with chrono backend
- Constructors: `datetime.datetime()`, `datetime.date()`, `datetime.time()`, `datetime.timedelta()`
- Class methods: `datetime.datetime.now()`, `datetime.datetime.today()`, `datetime.date.today()`
- Factory methods: `fromtimestamp()`, `fromisoformat()`, `strptime()`
- Instance methods: `strftime()`, `isoformat()`, `replace()`, `timestamp()`, `weekday()`, `isoweekday()`
- **Date arithmetic operations**:
- `datetime + timedelta` → datetime
- `datetime - timedelta` → datetime
- `datetime - datetime` → timedelta
- `date + timedelta` → date
- `date - timedelta` → date
- `date - date` → timedelta
- `timedelta + timedelta` → timedelta
- `timedelta - timedelta` → timedelta
- New dedicated IRType variants: `Datetime`, `Date`, `Time`, `Timedelta`
- Datetime represented as 7 i32s: (year, month, day, hour, minute, second, microsecond)
- Date represented as 3 i32s: (year, month, day)
- Time represented as 4 i32s: (hour, minute, second, microsecond)
- Timedelta represented as 3 i32s: (days, seconds, microseconds)
- Test suite in `examples/test_datetime.py`

- **Logging Module** (Issue #34)
- Complete implementation of Python's `logging` standard library module
- Log level constants: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`, `NOTSET`
Expand Down
2 changes: 1 addition & 1 deletion docs/modules.html
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ <h1 class="title">Waspy Development Board</h1>
{ name: "random module (random, randint, randrange, uniform, choice, shuffle, sample, seed, getrandbits, gauss, normalvariate, expovariate)", status: "done", version: "0.8.0" },
{ name: "json module (loads, dumps, load, dump, JSONEncoder, JSONDecoder) - runtime implementation", status: "done", version: "unreleased" },
{ name: "re module (compile, search, match, fullmatch, findall, finditer, split, sub, subn, escape, purge, IGNORECASE, MULTILINE, DOTALL, VERBOSE, ASCII)", status: "done", version: "0.8.0" },
{ name: "datetime module (datetime, date, time, timedelta, timezone, tzinfo, now, today, fromtimestamp, fromisoformat, strftime, strptime, replace, timestamp, isoformat, weekday, isoweekday, MINYEAR, MAXYEAR)", status: "done", version: "0.8.0" },
{ name: "datetime module (datetime, date, time, timedelta, timezone, tzinfo, now, today, fromtimestamp, fromisoformat, strftime, strptime, replace, timestamp, isoformat, weekday, isoweekday, MINYEAR, MAXYEAR) - full runtime support", status: "done", version: "unreleased" },
{ name: "collections module (namedtuple, deque, Counter, OrderedDict, defaultdict, ChainMap, UserDict, UserList, UserString)", status: "done", version: "0.8.0" },
{ name: "itertools module (count, cycle, repeat, chain, compress, dropwhile, filterfalse, groupby, islice, starmap, takewhile, tee, zip_longest, product, permutations, combinations, combinations_with_replacement, accumulate, batched, pairwise)", status: "done", version: "0.8.0" },
{ name: "functools module (reduce, partial, partialmethod, wraps, update_wrapper, total_ordering, cmp_to_key, lru_cache, cache, cached_property, singledispatch, singledispatchmethod)", status: "done", version: "0.8.0" },
Expand Down
81 changes: 80 additions & 1 deletion examples/test_datetime.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,86 @@
import datetime

def test_datetime():
def test_datetime_constants():
"""Test datetime module constants."""
minyear = datetime.MINYEAR
maxyear = datetime.MAXYEAR
return maxyear

def test_datetime_now():
"""Test datetime.datetime.now()."""
now = datetime.datetime.now()
return now

def test_date_today():
"""Test datetime.date.today()."""
today = datetime.date.today()
return today

def test_datetime_constructor():
"""Test datetime constructor."""
dt = datetime.datetime(2024, 12, 10, 14, 30, 0)
return dt

def test_date_constructor():
"""Test date constructor."""
d = datetime.date(2024, 12, 10)
return d

def test_time_constructor():
"""Test time constructor."""
t = datetime.time(14, 30, 0)
return t

def test_timedelta():
"""Test timedelta constructor."""
td = datetime.timedelta(1, 3600, 0)
return td

def test_datetime_add_timedelta():
"""Test datetime + timedelta arithmetic."""
dt = datetime.datetime(2024, 12, 10, 14, 30, 0)
td = datetime.timedelta(1, 0, 0)
result = dt + td
return result

def test_datetime_sub_timedelta():
"""Test datetime - timedelta arithmetic."""
dt = datetime.datetime(2024, 12, 10, 14, 30, 0)
td = datetime.timedelta(1, 0, 0)
result = dt - td
return result

def test_datetime_diff():
"""Test datetime - datetime arithmetic."""
dt1 = datetime.datetime(2024, 12, 10, 14, 30, 0)
dt2 = datetime.datetime(2024, 12, 9, 14, 30, 0)
diff = dt1 - dt2
return diff

def test_date_add_timedelta():
"""Test date + timedelta arithmetic."""
d = datetime.date(2024, 12, 10)
td = datetime.timedelta(7, 0, 0)
result = d + td
return result

def test_date_diff():
"""Test date - date arithmetic."""
d1 = datetime.date(2024, 12, 10)
d2 = datetime.date(2024, 12, 1)
diff = d1 - d2
return diff

def test_timedelta_add():
"""Test timedelta + timedelta arithmetic."""
td1 = datetime.timedelta(1, 0, 0)
td2 = datetime.timedelta(2, 0, 0)
result = td1 + td2
return result

def test_timedelta_sub():
"""Test timedelta - timedelta arithmetic."""
td1 = datetime.timedelta(5, 0, 0)
td2 = datetime.timedelta(2, 0, 0)
result = td1 - td2
return result
4 changes: 4 additions & 0 deletions src/analysis/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,5 +135,9 @@ fn type_to_string(ir_type: &ir::IRType) -> String {
ir::IRType::Unknown => "unknown".to_string(),
ir::IRType::Callable { .. } => "Callable".to_string(),
ir::IRType::Generator(yield_type) => format!("Generator[{}]", type_to_string(yield_type)),
ir::IRType::Datetime => "datetime.datetime".to_string(),
ir::IRType::Date => "datetime.date".to_string(),
ir::IRType::Time => "datetime.time".to_string(),
ir::IRType::Timedelta => "datetime.timedelta".to_string(),
}
}
Loading