Skip to content

Commit f57f21b

Browse files
Merge pull request #18 from priyanka-amarnani/feature/parse-operators
Feature/parse operators
2 parents edee5b3 + 08fafd3 commit f57f21b

File tree

12 files changed

+149
-5
lines changed

12 files changed

+149
-5
lines changed

EXPRESSION_SUPPORT.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@
3939
| SumOperation ||
4040
| SwitchOperation ||
4141
| ThenOperation ||
42-
| ToDateOperation | |
43-
| ToDateTimeOperation | |
42+
| ToDateOperation | |
43+
| ToDateTimeOperation | |
4444
| ToEnumOperation ||
45-
| ToIntOperation | |
45+
| ToIntOperation | |
4646
| ToStringOperation ||
47-
| ToTimeOperation | |
48-
| ToZonedDateTimeOperation | |
47+
| ToTimeOperation | |
48+
| ToZonedDateTimeOperation | |
4949
| UnaryFunctionalOperation | |
5050
| RosettaAbsentOperation ||
5151
| RosettaBinaryOperation ||

src/main/java/com/regnosys/rosetta/generator/python/expressions/PythonExpressionGenerator.xtend

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ import com.regnosys.rosetta.rosetta.expression.SortOperation
3939
import com.regnosys.rosetta.rosetta.expression.SumOperation
4040
import com.regnosys.rosetta.rosetta.expression.ThenOperation
4141
import com.regnosys.rosetta.rosetta.expression.ToStringOperation
42+
import com.regnosys.rosetta.rosetta.expression.ToDateOperation
43+
import com.regnosys.rosetta.rosetta.expression.ToDateTimeOperation
44+
import com.regnosys.rosetta.rosetta.expression.ToIntOperation
45+
import com.regnosys.rosetta.rosetta.expression.ToTimeOperation
46+
import com.regnosys.rosetta.rosetta.expression.ToZonedDateTimeOperation
4247
import com.regnosys.rosetta.rosetta.expression.ToEnumOperation
4348
import com.regnosys.rosetta.rosetta.expression.RosettaDeepFeatureCall
4449
import com.regnosys.rosetta.rosetta.expression.MinOperation
@@ -86,6 +91,11 @@ class PythonExpressionGenerator {
8691
SwitchOperation: generateSwitchOperation(expr, ifLevel, isLambda)
8792
ToEnumOperation: '''«expr.enumeration.name»(«generateExpression(expr.argument, ifLevel, isLambda)»)'''
8893
ToStringOperation: '''rune_str(«generateExpression(expr.argument, ifLevel, isLambda)»)'''
94+
ToDateOperation: '''datetime.datetime.strptime(«generateExpression(expr.argument, ifLevel, isLambda)», "%Y-%m-%d").date()'''
95+
ToDateTimeOperation: '''datetime.datetime.strptime(«generateExpression(expr.argument, ifLevel, isLambda)», "%Y-%m-%d %H:%M:%S")'''
96+
ToIntOperation: '''int(«generateExpression(expr.argument, ifLevel, isLambda)»)'''
97+
ToTimeOperation: '''datetime.datetime.strptime(«generateExpression(expr.argument, ifLevel, isLambda)», "%H:%M:%S").time()'''
98+
ToZonedDateTimeOperation:'''datetime.datetime.strptime(«generateExpression(expr.argument, ifLevel, isLambda)», "%Y-%m-%d %H:%M:%S %z %Z")'''
8999
// Rune Operations
90100
RosettaAbsentExpression: '''(not rune_attr_exists(«generateExpression(expr.argument, ifLevel, isLambda)»))'''
91101
RosettaBinaryOperation: generateBinaryExpression(expr, ifLevel, isLambda)
@@ -247,6 +257,7 @@ class PythonExpressionGenerator {
247257

248258
return _builder.toString
249259
}
260+
250261

251262
private def String generateReference(RosettaReference expr, int ifLevel, boolean isLambda) {
252263
switch (expr) {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace rosetta_dsl.test.semantic.toDateOp : <"generate Python unit tests from Rosetta.">
2+
3+
type TestDateOp:
4+
a string (1..1)
5+
b date (0..1)
6+
condition Test:
7+
b = a to-date
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace rosetta_dsl.test.semantic.toDateTimeOp : <"generate Python unit tests from Rosetta.">
2+
3+
type TestDateTimeOp:
4+
a string (1..1)
5+
b dateTime (0..1)
6+
condition Test:
7+
b = a to-date-time
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace rosetta_dsl.test.semantic.toIntOp : <"generate Python unit tests from Rosetta.">
2+
3+
type TestToIntOp:
4+
a string (1..1)
5+
b int (0..1)
6+
condition Test:
7+
b = a to-int
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace rosetta_dsl.test.semantic.toTimeOp : <"generate Python unit tests from Rosetta.">
2+
3+
type TestToTimeOp:
4+
a string (1..1)
5+
b time (0..1)
6+
condition Test:
7+
b = a to-time
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace rosetta_dsl.test.semantic.toZonedDateTimeOp : <"generate Python unit tests from Rosetta.">
2+
3+
type TestToZonedDateTimeOp:
4+
a string (1..1)
5+
b zonedDateTime (0..1)
6+
condition Test:
7+
b = a to-zoned-date-time
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
'''to-date unit tests'''
2+
from datetime import date
3+
4+
import pytest
5+
6+
from rosetta_dsl.test.semantic.toDateOp.TestDateOp import TestDateOp
7+
8+
def test_to_date_passes():
9+
to_date_test= TestDateOp(a="2025-05-26",b=date(2025, 5, 26))
10+
to_date_test.validate_model()
11+
def test_to_date_invalid_format_fails():
12+
to_date_test= TestDateOp(a="2025/05/26", b=date(2025,5,26))
13+
with pytest.raises(Exception):
14+
to_date_test.validate_model()
15+
16+
if __name__ == "__main__":
17+
test_to_date_passes()
18+
test_to_date_invalid_format_fails()
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
'''to-date-time unit tests'''
2+
3+
import datetime
4+
5+
import pytest
6+
7+
from rosetta_dsl.test.semantic.toDateTimeOp.TestDateTimeOp import TestDateTimeOp
8+
9+
def test_to_date_time_passes():
10+
to_date_time_test= TestDateTimeOp(a="2025-05-26 14:30:00",b=datetime.datetime(2025, 5, 26,14,30,0))
11+
to_date_time_test.validate_model()
12+
13+
def test_to_date_time_fails():
14+
to_date_time_test=TestDateTimeOp(a="2025-05-26 14-30-00",b=datetime.datetime(2025, 5, 26,14,30,0))
15+
with pytest.raises(Exception):
16+
to_date_time_test.validate_model()
17+
18+
if __name__ == "__main__":
19+
test_to_date_time_passes()
20+
test_to_date_time_fails()
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
'''to-int unit tests'''
2+
3+
import pytest
4+
5+
from rosetta_dsl.test.semantic.toIntOp.TestToIntOp import TestToIntOp
6+
7+
8+
def test_to_int_passes():
9+
to_int_test = TestToIntOp(a="1",b=1)
10+
to_int_test.validate_model()
11+
12+
def test_to_int_fails():
13+
to_int_test= TestToIntOp(a="a",b=1)
14+
with pytest.raises(Exception):
15+
to_int_test.validate_model()
16+
17+
if __name__ == "__main__":
18+
test_to_int_passes()
19+
test_to_int_fails()

0 commit comments

Comments
 (0)