diff --git a/README.md b/README.md
index 7107492..afa01bb 100644
--- a/README.md
+++ b/README.md
@@ -12,24 +12,24 @@
### Supported asserts:
-| Assert | Description | Example | Return |
-|-------------------------------------------------------------|---------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------|----------------------------------------------------|
-| assert_true(condition, message=None) | Verify that condition is True | soft_asserts.assert_true(a == b) | True if assertion passes, False if assertion fails |
-| assert_false(condition, message=None) | Verify that condition is False | soft_asserts.assert_false(a == b) | True if assertion passes, False if assertion fails |
-| assert_equal(first, second, message=None) | Verify that first is equal to second | soft_asserts.assert_equal(a, b) | True if assertion passes, False if assertion fails |
-| assert_not_equal(first, second, message=None) | Verify that first is not equal to second | soft_asserts.assert_not_equal(a, b) | True if assertion passes, False if assertion fails |
-| assert_is(first, second, message=None) | Verify that first and second are the same object | soft_asserts.assert_is(a, b) | True if assertion passes, False if assertion fails |
-| assert_is_not(first, second, message=None) | Verify that first and second are not the same object | soft_asserts.assert_is_not(a, b) | True if assertion passes, False if assertion fails |
-| assert_is_none(obj, message=None) | Verify that obj is None | soft_asserts.assert_is_none(a) | True if assertion passes, False if assertion fails |
-| assert_is_not_none(obj, message=None) | Verify that obj is not None | soft_asserts.assert_is_not_none(a) | True if assertion passes, False if assertion fails |
-| assert_in(obj, container, message=None) | Verify that obj is in container | soft_asserts.assert_in(a, [a, b, c]) | True if assertion passes, False if assertion fails |
-| assert_not_in(obj, container, message=None) | Verify that obj is not in container | soft_asserts.assert_not_in(a, [b, c]) | True if assertion passes, False if assertion fails |
-| assert_is_instance(obj, cls, message=None) | Verify that obj is instance of cls | soft_asserts.assert_is_instance(a, A) | True if assertion passes, False if assertion fails |
-| assert_is_not_instance(obj, cls, message=None) | Verify that obj is not instance of cls | soft_asserts.assert_is_not_instance(a, B) | True if assertion passes, False if assertion fails |
-| assert_almost_equal(first, second, delta, message=None) | Verify that first is almost equal to second
and the different is equal or less to delta | soft_asserts.assert_almost_equal(1.001, 1.002, 0.1) | True if assertion passes, False if assertion fails |
-| assert_not_almost_equal(first, second, delta, message=None) | Verify that first is not almost equal to second
and the different is more than delta | soft_asserts.assert_not_almost_equal(1.001, 1.002, 0.00001) | True if assertion passes, False if assertion fails |
-| assert_raises(exception, method: Callable, *args, **kwargs) | Verify that method execution raise exception | soft_asserts.assert_raises(TypeError, sum, 'a', 2) | True if assertion passes, False if assertion fails |
-| assert_raises_with(exception, message=None) | Verify that execution in 'with' block raise exception | with soft_asserts.assert_raised_with(ValueError):
raise ValueError(ERROR_MESSAGE_1) | |
+| Assert | Description | Example | Return |
+|-------------------------------------------------------------|-----------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------|-----------------------------------------------------|
+| assert_true(condition, message=None) | Verify that condition is True. | soft_asserts.assert_true(a == b) | True if assertion passes, False if assertion fails. |
+| assert_false(condition, message=None) | Verify that condition is False. | soft_asserts.assert_false(a == b) | True if assertion passes, False if assertion fails. |
+| assert_equal(first, second, message=None) | Verify that first is equal to second. | soft_asserts.assert_equal(a, b) | True if assertion passes, False if assertion fails. |
+| assert_not_equal(first, second, message=None) | Verify that first is not equal to second. | soft_asserts.assert_not_equal(a, b) | True if assertion passes, False if assertion fails. |
+| assert_is(first, second, message=None) | Verify that first and second are the same object. | soft_asserts.assert_is(a, b) | True if assertion passes, False if assertion fails. |
+| assert_is_not(first, second, message=None) | Verify that first and second are not the same object. | soft_asserts.assert_is_not(a, b) | True if assertion passes, False if assertion fails. |
+| assert_is_none(obj, message=None) | Verify that obj is None. | soft_asserts.assert_is_none(a) | True if assertion passes, False if assertion fails. |
+| assert_is_not_none(obj, message=None) | Verify that obj is not None. | soft_asserts.assert_is_not_none(a) | True if assertion passes, False if assertion fails. |
+| assert_in(obj, container, message=None) | Verify that obj is in container. | soft_asserts.assert_in(a, [a, b, c]) | True if assertion passes, False if assertion fails. |
+| assert_not_in(obj, container, message=None) | Verify that obj is not in container. | soft_asserts.assert_not_in(a, [b, c]) | True if assertion passes, False if assertion fails. |
+| assert_is_instance(obj, cls, message=None) | Verify that obj is instance of cls. | soft_asserts.assert_is_instance(a, A) | True if assertion passes, False if assertion fails. |
+| assert_is_not_instance(obj, cls, message=None) | Verify that obj is not instance of cls. | soft_asserts.assert_is_not_instance(a, B) | True if assertion passes, False if assertion fails. |
+| assert_almost_equal(first, second, delta, message=None) | Verify that first is almost equal to second,
and the different is equal or less to delta. | soft_asserts.assert_almost_equal(1.001, 1.002, 0.1) | True if assertion passes, False if assertion fails. |
+| assert_not_almost_equal(first, second, delta, message=None) | Verify that first is not almost equal to second,
and the different is more than delta. | soft_asserts.assert_not_almost_equal(1.001, 1.002, 0.00001) | True if assertion passes, False if assertion fails. |
+| assert_raises(exception, method: Callable, *args, **kwargs) | Verify that method execution raise exception. | soft_asserts.assert_raises(TypeError, sum, 'a', 2) | True if assertion passes, False if assertion fails. |
+| assert_raises_with(exception, message=None) | Verify that execution in 'with' block raise exception. | with soft_asserts.assert_raised_with(ValueError):
raise ValueError(ERROR_MESSAGE_1) | |
In the end of each test, the soft asserts will be verified and the test will be marked as failed if any of the asserts failed.
@@ -109,13 +109,15 @@ def test_skip_if_step_2_fail():
#### Print error on each failed assert
Each assertion failure can be printed.
-This can be done by adding logger or by adding a print method.
+This can be done by adding logger or by adding a print method.
In case a logger will be added to soft asserts, then logger.error(message) will be used.
-In case a print method will be added to soft asserts, then print_method(message) will be used.
+In case a print method will be added to soft asserts, then print_method(message) will be used.
-_logger and print method cannot be added together._
+#### Error format
+
+`message [file_path: line_number] code_line`
#### logger example:
diff --git a/RELEASE.md b/RELEASE.md
index b84a12f..5c1a5bd 100644
--- a/RELEASE.md
+++ b/RELEASE.md
@@ -1,5 +1,11 @@
# nrt-pytest-soft-asserts
+## Version 1.1.0
+
+### New features:
+
+Error message is in `message [file_path: line_number] code_line` format.
+
## Version 1.0.9
Support in latest version of pytest.
diff --git a/coverage_report/lcov.info b/coverage_report/lcov.info
index 61d782c..3cd71ca 100644
--- a/coverage_report/lcov.info
+++ b/coverage_report/lcov.info
@@ -1,260 +1,282 @@
TN:
SF:nrt_pytest_soft_asserts\soft_asserts.py
-DA:1,1,7HpIEQVf5K0efdTzo05mJg
-DA:2,1,YOe9avog2o7Ju8MeMAAAVQ
-DA:5,1,CT9XrugR0VmgtyLiirko8A
-DA:6,1,UWMFjPhL9cjw2PNid09Teg
-DA:7,1,+SGCpVWY58FgRVOVeHAUaQ
-DA:8,1,hrAqVZ4+nJDfZWiyo7USPQ
-DA:11,1,VWrOtSvpsG3XM/+ldlYTtw
-DA:12,1,/ZvqiDY7XVzMiSFdpC6ZCg
-DA:18,1,nbKTbmHFx7nM+aMlyHoQuQ
-DA:19,1,cZwl7SZ7Og3/jQc9chklaw
-DA:20,1,o/ICqHT57VM1Vq7HjJyy3A
-DA:21,1,8gMV8dVZf8YNcIeIuAT9mg
-DA:22,1,X04jIckKz8MzqNgMEd/zuQ
-DA:24,1,gFdnwIzxJ64X+nD2UauP7A
-DA:25,1,euNjmfcAJnt/3VzkyXBypw
-DA:26,1,VoZlPxzJT8iSDla3nXg6gA
-DA:28,1,w/qRhPKePx2X8WQ5IFwHQw
-DA:29,1,wLAvyX6ae7qHPfR0U5nuNQ
-DA:31,1,xZzMcn+sbVdMvp1XWeSE3A
-DA:32,1,TCKiqpktFcWqlWOlIXkr/Q
-DA:34,1,2feaP53LICTkUXoufDnSow
-DA:35,1,UNg5Tja4vJsKufLKzB/kig
-DA:36,1,cF/F8prOxehBDvWes+tMMg
-DA:37,1,SddcyX1RBTAngKzlGAFzog
-DA:38,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:40,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:42,1,s1bL95czphICJYesf40P0g
-DA:43,1,SVjSWEY0bM8LLJH3qp/3Og
-DA:44,1,BSDSyrd28WloFCHGdn2FQQ
-DA:45,1,SddcyX1RBTAngKzlGAFzog
-DA:46,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:48,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:50,1,a9xTv53C92gEOcB2C7sang
-DA:51,1,fPOM4pkCeXOfL2Nmu5oikw
-DA:52,1,KTOM1IoHRdymNOi2MOrfow
-DA:53,1,SddcyX1RBTAngKzlGAFzog
-DA:54,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:56,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:58,1,c/GTJITtfeL5VVJmP7cM4A
-DA:59,1,cs5FkiD5nnhu8NJ+8Cen0g
-DA:60,1,MMzR/4FNHLQDvhbSfEhRjg
-DA:61,1,SddcyX1RBTAngKzlGAFzog
-DA:62,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:64,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:66,1,wzaRxf7eNUIkALABgtSBOg
-DA:67,1,TJY/ZQHPl6v9wt0iiFUHgA
-DA:68,1,ByiK0QTfZbN7pcEJMLnKnA
-DA:69,1,SddcyX1RBTAngKzlGAFzog
-DA:70,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:72,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:74,1,ohnxQgVjMajng4B983+dOQ
-DA:75,1,caD9Ne8dKQaQHLzB/bHx1A
-DA:76,1,x9Djg3dmtnNgOW88ewk5Gw
-DA:77,1,SddcyX1RBTAngKzlGAFzog
-DA:78,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:80,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:82,1,aGNyC4j4/11W0ojkq1MItg
-DA:83,1,HOBRRotEGUH3HEJEbr0YUA
-DA:84,1,vZnC+h5JTs752xY6owGb4g
-DA:85,1,SddcyX1RBTAngKzlGAFzog
-DA:86,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:88,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:90,1,nDajlSGkW4YMvTZoO+q+ug
-DA:91,1,EGNruTy0X+Kp9Jkg/flHiw
-DA:92,1,Ob0eQ+a3YhRVJHOBXnjrRA
-DA:93,1,SddcyX1RBTAngKzlGAFzog
-DA:94,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:96,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:98,1,BgltoEotRwyRJFO8ekhLJA
-DA:99,1,UxwR8N+Yj6i7HYMpbMepww
-DA:100,1,RzRBmIy8MpMoehK51SMnPA
-DA:101,1,SddcyX1RBTAngKzlGAFzog
-DA:102,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:104,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:106,1,HKL+A4SYWO42UDwPBqF9/Q
-DA:107,1,hUWpochcPK4BW5vofnIyIQ
-DA:108,1,y+St3rSnijDiXGKMyWbmzQ
-DA:109,1,SddcyX1RBTAngKzlGAFzog
-DA:110,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:112,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:114,1,Me1jgvIGrsr4qnriHUjthg
-DA:115,1,hMZeVjp7IQfEeIhu7T6Qug
-DA:116,1,Xul9OhdjYz634dcls+D5Sg
-DA:117,1,SddcyX1RBTAngKzlGAFzog
-DA:118,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:120,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:122,1,Tp9UPj/6BSBU3OiLKVehTQ
-DA:123,1,LEr6iS1ehZPEln0938LgDA
-DA:124,1,7CSN9PHZE0v8HuRE7SFpHQ
-DA:125,1,SddcyX1RBTAngKzlGAFzog
-DA:126,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:128,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:130,1,jt1nVjofbe6seP/zpYulag
-DA:131,1,ABp2lMt/GqraddSKyQroNg
-DA:132,1,Gl3BECggWbqqjd2cqP4bRw
-DA:133,1,SddcyX1RBTAngKzlGAFzog
-DA:134,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:136,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:138,1,FOJoFrDX8goW8TK04Am1gg
-DA:139,1,BEji8rHRRQd6Khq3M6eG1A
-DA:140,1,OkhVZVE4+qXfT2qlBfFMCg
-DA:141,1,SddcyX1RBTAngKzlGAFzog
-DA:142,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:144,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:146,1,7Id/9w+MJ7mmStv5GmlnEQ
-DA:147,1,xjcDBnSwra0OiNOAYAwoHA
-DA:148,1,fzgfIgcG6g+2bwqhpFlehA
-DA:149,1,1bm+6DR9CmDHJRc1CVEkAA
-DA:150,1,SddcyX1RBTAngKzlGAFzog
-DA:151,1,kycMaH6XbPuAfUpgfG1Lbg
-DA:152,1,cCzhnT+1tmGi11b28Pmfwg
-DA:153,1,FFqRFcnwn5yIyeIymeaJKA
-DA:154,1,cHkzfZuxAWImImgqWlqrvA
-DA:155,1,BPFPHxC1g838zXudSH9ZRw
-DA:156,1,7N/JFuOs+JgNw/t49ouLjw
-DA:158,1,eJ6zrxnLWn/k18a2vHOhRA
-DA:160,1,7b0pW+COted0848FtuVb6w
-DA:161,1,5q+soJGeT4wj2rvA0ImJjw
-DA:162,1,oGXcTu7RhYjXaCN+oyGeow
-DA:163,1,WLm2H1W+3yCdma2u9U4Q8Q
-DA:165,1,NgEyPOKakdhldTxcO/9WTw
-DA:166,1,9tjsd4fQsN3iZRwF3XVokQ
-DA:167,1,jVibu8inmyhUmI99MXh8cQ
-DA:169,1,qCY/j2HCLFtYyfrTwAWWTA
-DA:170,1,Lfip+xp+akrfc/rJIcMOhA
-DA:172,1,KUmQB5oU4NORV0lSdMIZZQ
-DA:173,1,dAfL0n8Wo5Ppew0jXSR2ew
-DA:174,1,DSI4Ot1H4VotwCjdGHX7OA
-DA:175,1,tQ6XNUsbh/EhqDe2FXTfEQ
-DA:176,1,MxcyyJW2FDs9bItTe2A0WQ
-DA:177,1,niU61jbEbVCIu9EZqALWTw
-DA:178,1,tQ6XNUsbh/EhqDe2FXTfEQ
-DA:180,1,n05AfdIFALNK7eRaTWeHow
-DA:182,1,0d4Sudq2J47ghEvQaeqPWg
-DA:184,1,kVvJCoZ+arOc3lZ+og4IEg
-DA:190,1,ogP0iNXJ2rXGUSaYFfx0HQ
-DA:192,1,rKc6OtluApu4vUPkue80OA
-DA:193,1,51oFRiFZA8XRplZCPT+gSA
-DA:194,1,D+1gEQAN6fkTn2TYmA0kkQ
-DA:196,1,cNL8bb7c9LibXQYEYcASDg
-DA:201,1,IPjK7F9pnamTy2HfVi2mgA
-DA:203,1,GjfNc4UJIb1+ODEoT4Hajw
-DA:204,1,jv3zm1wOeBalyM4h/jcIlw
-DA:206,1,MZYNNYkbtsx2Hg+DZ/h3rg
-DA:207,1,UgfgQM6wxrSfJ+EcPxgD7Q
-DA:209,1,HmADa1g/W1C2Vo9Wm4sNNA
-DA:210,1,YZHh1zdnsa3bb+dCKtCLig
-DA:211,1,tWBXudt5bV+DpuYf1ygf2g
-DA:213,1,HmADa1g/W1C2Vo9Wm4sNNA
-DA:214,1,IGhNwPBj/a1FDMfnrvNhxA
-DA:215,1,Lmo1GBciEu5kMSFvKCB7QA
-DA:217,1,B+mxYdm1Xk4QgBlIJzGpEA
-DA:218,1,/ZJ79mb3sx4CFjKob6BxSg
-DA:219,1,jJxyxzcVU/1lqNaNLAC6ww
-DA:221,1,Wd4o5epo//51J+v3mzza3g
-DA:222,1,vDeONdWNzGB1bPJZokLllA
-DA:223,1,/Lct/aa+gRDnOrNcSDT0ZA
-DA:225,1,Nnqu9X+lU2lagW39QNhFWA
-DA:226,1,143uiKojxDtCstS6tDiQ5A
-DA:227,1,Ahj3u1JF+byhc08crW0QLQ
-DA:229,1,mNeFbVseW/qARC32FDxTEQ
-DA:230,1,acMBX5l1srZ491NxjonaeA
-DA:231,1,vmrz1EiRGmh1MNZlc7IsNQ
-DA:232,1,vtZuiIh5DSDD2AlHVYOVKw
-DA:234,1,Nnqu9X+lU2lagW39QNhFWA
-DA:235,1,NmqLPZ3fyfxpCRHbaSiJOQ
-DA:236,1,IrKsTNk7dtBPez/9W/Qj+g
-DA:237,1,iecXh0RffNZfyyBKrCOmrA
-DA:239,1,Nnqu9X+lU2lagW39QNhFWA
-DA:240,1,Jb45BMi1721wc8ypt23M6g
-DA:241,1,XceuZSE58kAuwRkXfCz3mg
-DA:243,1,Nnqu9X+lU2lagW39QNhFWA
-DA:244,1,AnuWxAUDyCmMczt8tp7TBw
-DA:245,1,n4NDUGewH3j5dzwolDzf5A
-DA:247,1,Nnqu9X+lU2lagW39QNhFWA
-DA:248,1,uk5+o+CCjDLLIkm9IQLPtQ
-DA:249,1,Yv5hMrZtSl+2+8NtPWsDLw
-DA:251,1,Nnqu9X+lU2lagW39QNhFWA
-DA:252,1,GflCFTf20x0JWupDDMETJA
-DA:253,1,q0wIMUlz3srDH0Lg+BK9mA
-DA:255,1,Nnqu9X+lU2lagW39QNhFWA
-DA:256,1,FfYeIxYuJuJRN5k6/K6Y7Q
-DA:257,1,1dqIY04d+M/CQT9EZGY5Fw
-LF:182
-LH:182
-BRDA:6,0,0,1
-BRDA:7,0,1,1
-BRDA:36,1,0,1
-BRDA:40,1,1,1
-BRDA:44,2,0,1
-BRDA:48,2,1,1
-BRDA:52,3,0,1
-BRDA:56,3,1,1
-BRDA:60,4,0,1
-BRDA:64,4,1,1
-BRDA:68,5,0,1
-BRDA:72,5,1,1
-BRDA:76,6,0,1
-BRDA:80,6,1,1
-BRDA:84,7,0,1
-BRDA:88,7,1,1
-BRDA:92,8,0,1
-BRDA:96,8,1,1
-BRDA:100,9,0,1
-BRDA:104,9,1,1
-BRDA:108,10,0,1
-BRDA:112,10,1,1
-BRDA:116,11,0,1
-BRDA:120,11,1,1
-BRDA:124,12,0,1
-BRDA:128,12,1,1
-BRDA:132,13,0,1
-BRDA:136,13,1,1
-BRDA:140,14,0,1
-BRDA:144,14,1,1
-BRDA:154,15,0,1
-BRDA:158,15,1,1
-BRDA:174,16,0,1
-BRDA:176,16,1,1
-BRDA:177,17,0,1
-BRDA:180,17,1,1
+DA:1,1,Lhk5d8oicIJYwDoccMDdHg
+DA:2,1,7Z9Lj4ed27Wf2hBX6jooEA
+DA:3,1,7HpIEQVf5K0efdTzo05mJg
+DA:4,1,YOe9avog2o7Ju8MeMAAAVQ
+DA:5,1,o7XN3CMj67n397EmDP0M3w
+DA:8,1,CT9XrugR0VmgtyLiirko8A
+DA:9,1,UWMFjPhL9cjw2PNid09Teg
+DA:10,1,+SGCpVWY58FgRVOVeHAUaQ
+DA:11,1,hrAqVZ4+nJDfZWiyo7USPQ
+DA:12,1,qbcWZTaHHkFMNzZLiRiJWg
+DA:13,1,x58qBQiiUN5gSgkjvQMEsA
+DA:14,1,sRjzUmZYGNMCGdE1QaJWlg
+DA:16,1,j+CcxAIEiLeqjzkbiEHnZA
+DA:17,1,h0T4olR8leEmpUnX6jQ87w
+DA:21,1,VWrOtSvpsG3XM/+ldlYTtw
+DA:22,1,/ZvqiDY7XVzMiSFdpC6ZCg
+DA:28,1,nbKTbmHFx7nM+aMlyHoQuQ
+DA:29,1,cZwl7SZ7Og3/jQc9chklaw
+DA:30,1,o/ICqHT57VM1Vq7HjJyy3A
+DA:31,1,8gMV8dVZf8YNcIeIuAT9mg
+DA:32,1,X04jIckKz8MzqNgMEd/zuQ
+DA:34,1,gFdnwIzxJ64X+nD2UauP7A
+DA:35,1,euNjmfcAJnt/3VzkyXBypw
+DA:36,1,VoZlPxzJT8iSDla3nXg6gA
+DA:38,1,w/qRhPKePx2X8WQ5IFwHQw
+DA:39,1,wLAvyX6ae7qHPfR0U5nuNQ
+DA:41,1,xZzMcn+sbVdMvp1XWeSE3A
+DA:42,1,TCKiqpktFcWqlWOlIXkr/Q
+DA:44,1,2feaP53LICTkUXoufDnSow
+DA:45,1,UNg5Tja4vJsKufLKzB/kig
+DA:46,1,cF/F8prOxehBDvWes+tMMg
+DA:47,1,SddcyX1RBTAngKzlGAFzog
+DA:48,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:50,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:52,1,s1bL95czphICJYesf40P0g
+DA:53,1,SVjSWEY0bM8LLJH3qp/3Og
+DA:54,1,BSDSyrd28WloFCHGdn2FQQ
+DA:55,1,SddcyX1RBTAngKzlGAFzog
+DA:56,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:58,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:60,1,a9xTv53C92gEOcB2C7sang
+DA:61,1,fPOM4pkCeXOfL2Nmu5oikw
+DA:62,1,KTOM1IoHRdymNOi2MOrfow
+DA:63,1,SddcyX1RBTAngKzlGAFzog
+DA:64,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:66,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:68,1,c/GTJITtfeL5VVJmP7cM4A
+DA:69,1,cs5FkiD5nnhu8NJ+8Cen0g
+DA:70,1,MMzR/4FNHLQDvhbSfEhRjg
+DA:71,1,SddcyX1RBTAngKzlGAFzog
+DA:72,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:74,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:76,1,wzaRxf7eNUIkALABgtSBOg
+DA:77,1,TJY/ZQHPl6v9wt0iiFUHgA
+DA:78,1,ByiK0QTfZbN7pcEJMLnKnA
+DA:79,1,SddcyX1RBTAngKzlGAFzog
+DA:80,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:82,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:84,1,ohnxQgVjMajng4B983+dOQ
+DA:85,1,caD9Ne8dKQaQHLzB/bHx1A
+DA:86,1,x9Djg3dmtnNgOW88ewk5Gw
+DA:87,1,SddcyX1RBTAngKzlGAFzog
+DA:88,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:90,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:92,1,aGNyC4j4/11W0ojkq1MItg
+DA:93,1,HOBRRotEGUH3HEJEbr0YUA
+DA:94,1,vZnC+h5JTs752xY6owGb4g
+DA:95,1,SddcyX1RBTAngKzlGAFzog
+DA:96,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:98,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:100,1,nDajlSGkW4YMvTZoO+q+ug
+DA:101,1,EGNruTy0X+Kp9Jkg/flHiw
+DA:102,1,Ob0eQ+a3YhRVJHOBXnjrRA
+DA:103,1,SddcyX1RBTAngKzlGAFzog
+DA:104,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:106,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:108,1,BgltoEotRwyRJFO8ekhLJA
+DA:109,1,UxwR8N+Yj6i7HYMpbMepww
+DA:110,1,RzRBmIy8MpMoehK51SMnPA
+DA:111,1,SddcyX1RBTAngKzlGAFzog
+DA:112,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:114,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:116,1,HKL+A4SYWO42UDwPBqF9/Q
+DA:117,1,hUWpochcPK4BW5vofnIyIQ
+DA:118,1,y+St3rSnijDiXGKMyWbmzQ
+DA:119,1,SddcyX1RBTAngKzlGAFzog
+DA:120,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:122,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:124,1,Me1jgvIGrsr4qnriHUjthg
+DA:125,1,hMZeVjp7IQfEeIhu7T6Qug
+DA:126,1,Xul9OhdjYz634dcls+D5Sg
+DA:127,1,SddcyX1RBTAngKzlGAFzog
+DA:128,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:130,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:132,1,Tp9UPj/6BSBU3OiLKVehTQ
+DA:133,1,LEr6iS1ehZPEln0938LgDA
+DA:134,1,7CSN9PHZE0v8HuRE7SFpHQ
+DA:135,1,SddcyX1RBTAngKzlGAFzog
+DA:136,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:138,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:140,1,jt1nVjofbe6seP/zpYulag
+DA:141,1,ABp2lMt/GqraddSKyQroNg
+DA:142,1,Gl3BECggWbqqjd2cqP4bRw
+DA:143,1,SddcyX1RBTAngKzlGAFzog
+DA:144,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:146,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:148,1,FOJoFrDX8goW8TK04Am1gg
+DA:149,1,BEji8rHRRQd6Khq3M6eG1A
+DA:150,1,OkhVZVE4+qXfT2qlBfFMCg
+DA:151,1,SddcyX1RBTAngKzlGAFzog
+DA:152,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:154,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:156,1,7Id/9w+MJ7mmStv5GmlnEQ
+DA:157,1,xjcDBnSwra0OiNOAYAwoHA
+DA:158,1,fzgfIgcG6g+2bwqhpFlehA
+DA:159,1,1bm+6DR9CmDHJRc1CVEkAA
+DA:160,1,SddcyX1RBTAngKzlGAFzog
+DA:161,1,kycMaH6XbPuAfUpgfG1Lbg
+DA:162,1,cCzhnT+1tmGi11b28Pmfwg
+DA:163,1,FFqRFcnwn5yIyeIymeaJKA
+DA:164,1,cHkzfZuxAWImImgqWlqrvA
+DA:165,1,BPFPHxC1g838zXudSH9ZRw
+DA:166,1,7N/JFuOs+JgNw/t49ouLjw
+DA:168,1,eJ6zrxnLWn/k18a2vHOhRA
+DA:170,1,7b0pW+COted0848FtuVb6w
+DA:171,1,5q+soJGeT4wj2rvA0ImJjw
+DA:172,1,oGXcTu7RhYjXaCN+oyGeow
+DA:173,1,WLm2H1W+3yCdma2u9U4Q8Q
+DA:175,1,NgEyPOKakdhldTxcO/9WTw
+DA:176,1,9tjsd4fQsN3iZRwF3XVokQ
+DA:177,1,jVibu8inmyhUmI99MXh8cQ
+DA:179,1,qCY/j2HCLFtYyfrTwAWWTA
+DA:180,1,Lfip+xp+akrfc/rJIcMOhA
+DA:182,1,KUmQB5oU4NORV0lSdMIZZQ
+DA:183,1,dAfL0n8Wo5Ppew0jXSR2ew
+DA:184,1,DSI4Ot1H4VotwCjdGHX7OA
+DA:185,1,tQ6XNUsbh/EhqDe2FXTfEQ
+DA:186,1,MxcyyJW2FDs9bItTe2A0WQ
+DA:187,1,niU61jbEbVCIu9EZqALWTw
+DA:188,1,tQ6XNUsbh/EhqDe2FXTfEQ
+DA:190,1,n05AfdIFALNK7eRaTWeHow
+DA:192,1,0d4Sudq2J47ghEvQaeqPWg
+DA:194,1,kVvJCoZ+arOc3lZ+og4IEg
+DA:200,1,ogP0iNXJ2rXGUSaYFfx0HQ
+DA:202,1,rKc6OtluApu4vUPkue80OA
+DA:203,1,51oFRiFZA8XRplZCPT+gSA
+DA:204,1,D+1gEQAN6fkTn2TYmA0kkQ
+DA:206,1,cNL8bb7c9LibXQYEYcASDg
+DA:211,1,NXnbOz6yv8VObuskZ3a09w
+DA:213,1,4Ai509LeMB+eQOSsyF0ceg
+DA:215,1,GjfNc4UJIb1+ODEoT4Hajw
+DA:216,1,jv3zm1wOeBalyM4h/jcIlw
+DA:218,1,MZYNNYkbtsx2Hg+DZ/h3rg
+DA:219,1,UgfgQM6wxrSfJ+EcPxgD7Q
+DA:221,1,HmADa1g/W1C2Vo9Wm4sNNA
+DA:222,1,YZHh1zdnsa3bb+dCKtCLig
+DA:223,1,tWBXudt5bV+DpuYf1ygf2g
+DA:225,1,HmADa1g/W1C2Vo9Wm4sNNA
+DA:226,1,IGhNwPBj/a1FDMfnrvNhxA
+DA:227,1,Lmo1GBciEu5kMSFvKCB7QA
+DA:229,1,B+mxYdm1Xk4QgBlIJzGpEA
+DA:230,1,/ZJ79mb3sx4CFjKob6BxSg
+DA:231,1,jJxyxzcVU/1lqNaNLAC6ww
+DA:233,1,Wd4o5epo//51J+v3mzza3g
+DA:235,1,uzhXwjJ9NZwxd4KflQkJjQ
+DA:238,1,yv59v8KaHavQluMyO7xT6Q
+DA:246,1,lbiZZRg9xYxeN8jnTZGJ9g
+DA:248,1,Rh+Fq7Y20+rrlbzMDYLgcQ
+DA:250,1,Nnqu9X+lU2lagW39QNhFWA
+DA:251,1,kF5iB3hgBW8WnyoggLwmfg
+DA:252,1,Ahj3u1JF+byhc08crW0QLQ
+DA:254,1,vNNTgt7R+e4BwFXobGtOlQ
+DA:256,1,mNeFbVseW/qARC32FDxTEQ
+DA:257,1,acMBX5l1srZ491NxjonaeA
+DA:258,1,vmrz1EiRGmh1MNZlc7IsNQ
+DA:259,1,vtZuiIh5DSDD2AlHVYOVKw
+DA:261,1,Nnqu9X+lU2lagW39QNhFWA
+DA:262,1,NmqLPZ3fyfxpCRHbaSiJOQ
+DA:263,1,IrKsTNk7dtBPez/9W/Qj+g
+DA:264,1,iecXh0RffNZfyyBKrCOmrA
+DA:266,1,Nnqu9X+lU2lagW39QNhFWA
+DA:267,1,Jb45BMi1721wc8ypt23M6g
+DA:268,1,XceuZSE58kAuwRkXfCz3mg
+DA:270,1,Nnqu9X+lU2lagW39QNhFWA
+DA:271,1,AnuWxAUDyCmMczt8tp7TBw
+DA:272,1,n4NDUGewH3j5dzwolDzf5A
+DA:274,1,Nnqu9X+lU2lagW39QNhFWA
+DA:275,1,uk5+o+CCjDLLIkm9IQLPtQ
+DA:276,1,Yv5hMrZtSl+2+8NtPWsDLw
+DA:278,1,Nnqu9X+lU2lagW39QNhFWA
+DA:279,1,GflCFTf20x0JWupDDMETJA
+DA:280,1,q0wIMUlz3srDH0Lg+BK9mA
+DA:282,1,Nnqu9X+lU2lagW39QNhFWA
+DA:283,1,FfYeIxYuJuJRN5k6/K6Y7Q
+DA:284,1,1dqIY04d+M/CQT9EZGY5Fw
+DA:286,1,Nnqu9X+lU2lagW39QNhFWA
+DA:287,1,EmQ+hxBlgQKFFnT9CP0d5Q
+DA:288,1,wGa+SQn8bApFMeivn0kWYA
+DA:289,1,rhh+0om3ksyfSzaGY9Tk0A
+DA:290,1,3/vpxbGaiug1MaL3IlGbdg
+DA:291,1,hKnFetzAAHrF5+pb/rogiw
+DA:292,1,8D0ZFuVO1joTZliocqancg
+DA:294,1,jJR6mVBBc4GHpLqW+Cu+AA
+LF:202
+LH:202
+BRDA:9,0,0,1
+BRDA:10,0,1,1
+BRDA:46,1,0,1
+BRDA:50,1,1,1
+BRDA:54,2,0,1
+BRDA:58,2,1,1
+BRDA:62,3,0,1
+BRDA:66,3,1,1
+BRDA:70,4,0,1
+BRDA:74,4,1,1
+BRDA:78,5,0,1
+BRDA:82,5,1,1
+BRDA:86,6,0,1
+BRDA:90,6,1,1
+BRDA:94,7,0,1
+BRDA:98,7,1,1
+BRDA:102,8,0,1
+BRDA:106,8,1,1
+BRDA:110,9,0,1
+BRDA:114,9,1,1
+BRDA:118,10,0,1
+BRDA:122,10,1,1
+BRDA:126,11,0,1
+BRDA:130,11,1,1
+BRDA:134,12,0,1
+BRDA:138,12,1,1
+BRDA:142,13,0,1
+BRDA:146,13,1,1
+BRDA:150,14,0,1
+BRDA:154,14,1,1
+BRDA:164,15,0,1
+BRDA:168,15,1,1
+BRDA:184,16,0,1
+BRDA:186,16,1,1
+BRDA:187,17,0,1
+BRDA:190,17,1,1
BRDA:0,18,0,1
-BRDA:193,18,1,1
+BRDA:203,18,1,1
BRDA:0,19,0,1
-BRDA:196,19,1,1
-BRDA:201,19,2,1
+BRDA:206,19,1,1
+BRDA:211,19,2,1
BRDA:0,20,0,1
-BRDA:0,20,1,1
-BRDA:201,20,2,1
-BRDA:209,21,0,1
-BRDA:213,21,1,1
-BRDA:213,22,0,1
-BRDA:217,22,1,1
-BRDA:217,23,0,1
-BRDA:221,23,1,1
-BRDA:225,24,0,1
-BRDA:234,24,1,1
-BRDA:230,25,0,1
-BRDA:231,25,1,1
+BRDA:211,20,1,1
+BRDA:213,20,2,1
+BRDA:221,21,0,1
+BRDA:225,21,1,1
+BRDA:225,22,0,1
+BRDA:229,22,1,1
+BRDA:229,23,0,1
+BRDA:233,23,1,1
+BRDA:250,24,0,1
+BRDA:261,24,1,1
+BRDA:257,25,0,1
+BRDA:258,25,1,1
BRDA:0,26,0,1
-BRDA:232,26,1,1
-BRDA:234,27,0,1
-BRDA:239,27,1,1
+BRDA:259,26,1,1
+BRDA:261,27,0,1
+BRDA:266,27,1,1
BRDA:0,28,0,1
-BRDA:237,28,1,1
-BRDA:239,29,0,1
-BRDA:243,29,1,1
-BRDA:243,30,0,1
-BRDA:247,30,1,1
-BRDA:247,31,0,1
-BRDA:251,31,1,1
-BRDA:251,32,0,1
-BRDA:255,32,1,1
-BRDA:0,33,0,1
-BRDA:255,33,1,1
-BRF:68
-BRH:68
+BRDA:264,28,1,1
+BRDA:266,29,0,1
+BRDA:270,29,1,1
+BRDA:270,30,0,1
+BRDA:274,30,1,1
+BRDA:274,31,0,1
+BRDA:278,31,1,1
+BRDA:278,32,0,1
+BRDA:282,32,1,1
+BRDA:282,33,0,1
+BRDA:286,33,1,1
+BRDA:0,34,0,1
+BRDA:286,34,1,1
+BRF:70
+BRH:70
end_of_record
diff --git a/coverage_report/report.json b/coverage_report/report.json
index e2cc579..246844c 100644
--- a/coverage_report/report.json
+++ b/coverage_report/report.json
@@ -1,7 +1,7 @@
{
"meta": {
"version": "7.3.0",
- "timestamp": "2024-06-18T22:56:16.521498",
+ "timestamp": "2024-07-05T00:10:59.584203",
"branch_coverage": true,
"show_contexts": false
},
@@ -10,156 +10,156 @@
"executed_lines": [
1,
2,
+ 3,
+ 4,
5,
- 6,
- 7,
8,
+ 9,
+ 10,
11,
12,
- 18,
- 19,
- 20,
+ 13,
+ 14,
+ 16,
+ 17,
21,
22,
- 24,
- 25,
- 26,
28,
29,
+ 30,
31,
32,
34,
35,
36,
- 37,
38,
- 40,
+ 39,
+ 41,
42,
- 43,
44,
45,
46,
+ 47,
48,
50,
- 51,
52,
53,
54,
+ 55,
56,
58,
- 59,
60,
61,
62,
+ 63,
64,
66,
- 67,
68,
69,
70,
+ 71,
72,
74,
- 75,
76,
77,
78,
+ 79,
80,
82,
- 83,
84,
85,
86,
+ 87,
88,
90,
- 91,
92,
93,
94,
+ 95,
96,
98,
- 99,
100,
101,
102,
+ 103,
104,
106,
- 107,
108,
109,
110,
+ 111,
112,
114,
- 115,
116,
117,
118,
+ 119,
120,
122,
- 123,
124,
125,
126,
+ 127,
128,
130,
- 131,
132,
133,
134,
+ 135,
136,
138,
- 139,
140,
141,
142,
+ 143,
144,
146,
- 147,
148,
149,
150,
151,
152,
- 153,
154,
- 155,
156,
+ 157,
158,
+ 159,
160,
161,
162,
163,
+ 164,
165,
166,
- 167,
- 169,
+ 168,
170,
+ 171,
172,
173,
- 174,
175,
176,
177,
- 178,
+ 179,
180,
182,
+ 183,
184,
+ 185,
+ 186,
+ 187,
+ 188,
190,
192,
- 193,
194,
- 196,
- 201,
+ 200,
+ 202,
203,
204,
206,
- 207,
- 209,
- 210,
211,
213,
- 214,
215,
- 217,
+ 216,
218,
219,
221,
@@ -171,336 +171,364 @@
229,
230,
231,
- 232,
- 234,
+ 233,
235,
- 236,
- 237,
- 239,
- 240,
- 241,
- 243,
- 244,
- 245,
- 247,
+ 238,
+ 246,
248,
- 249,
+ 250,
251,
252,
- 253,
- 255,
+ 254,
256,
- 257
+ 257,
+ 258,
+ 259,
+ 261,
+ 262,
+ 263,
+ 264,
+ 266,
+ 267,
+ 268,
+ 270,
+ 271,
+ 272,
+ 274,
+ 275,
+ 276,
+ 278,
+ 279,
+ 280,
+ 282,
+ 283,
+ 284,
+ 286,
+ 287,
+ 288,
+ 289,
+ 290,
+ 291,
+ 292,
+ 294
],
"summary": {
- "covered_lines": 182,
- "num_statements": 182,
+ "covered_lines": 202,
+ "num_statements": 202,
"percent_covered": 100.0,
"percent_covered_display": "100",
"missing_lines": 0,
"excluded_lines": 0,
- "num_branches": 68,
+ "num_branches": 70,
"num_partial_branches": 0,
- "covered_branches": 68,
+ "covered_branches": 70,
"missing_branches": 0
},
"missing_lines": [],
"excluded_lines": [],
"executed_branches": [
[
- 5,
- 6
+ 8,
+ 9
],
[
- 5,
- 7
+ 8,
+ 10
],
[
- 35,
- 36
+ 45,
+ 46
],
[
- 35,
- 40
+ 45,
+ 50
],
[
- 43,
- 44
+ 53,
+ 54
],
[
- 43,
- 48
+ 53,
+ 58
],
[
- 51,
- 52
+ 61,
+ 62
],
[
- 51,
- 56
+ 61,
+ 66
],
[
- 59,
- 60
+ 69,
+ 70
],
[
- 59,
- 64
+ 69,
+ 74
],
[
- 67,
- 68
+ 77,
+ 78
],
[
- 67,
- 72
+ 77,
+ 82
],
[
- 75,
- 76
+ 85,
+ 86
],
[
- 75,
- 80
+ 85,
+ 90
],
[
- 83,
- 84
+ 93,
+ 94
],
[
- 83,
- 88
+ 93,
+ 98
],
[
- 91,
- 92
+ 101,
+ 102
],
[
- 91,
- 96
+ 101,
+ 106
],
[
- 99,
- 100
+ 109,
+ 110
],
[
- 99,
- 104
+ 109,
+ 114
],
[
- 107,
- 108
+ 117,
+ 118
],
[
- 107,
- 112
+ 117,
+ 122
],
[
- 115,
- 116
+ 125,
+ 126
],
[
- 115,
- 120
+ 125,
+ 130
],
[
- 123,
- 124
+ 133,
+ 134
],
[
- 123,
- 128
+ 133,
+ 138
],
[
- 131,
- 132
+ 141,
+ 142
],
[
- 131,
- 136
+ 141,
+ 146
],
[
- 139,
- 140
+ 149,
+ 150
],
[
- 139,
- 144
+ 149,
+ 154
],
[
- 153,
- 154
+ 163,
+ 164
],
[
- 153,
- 158
+ 163,
+ 168
],
[
- 173,
- 174
+ 183,
+ 184
],
[
- 173,
- 176
+ 183,
+ 186
],
[
- 176,
- 177
+ 186,
+ 187
],
[
- 176,
- 180
+ 186,
+ 190
],
[
- 192,
- -184
+ 202,
+ -194
],
[
- 192,
- 193
+ 202,
+ 203
],
[
- 196,
- -196
+ 206,
+ -206
],
[
- 196,
- 196
+ 206,
+ 206
],
[
- 196,
- 201
+ 206,
+ 211
],
[
- 201,
- -201
+ 211,
+ -211
],
[
- 201,
- -184
+ 211,
+ 211
],
[
- 201,
- 201
+ 211,
+ 213
],
[
- 210,
- 209
+ 222,
+ 221
],
[
- 210,
- 213
+ 222,
+ 225
],
[
- 214,
- 213
+ 226,
+ 225
],
[
- 214,
- 217
+ 226,
+ 229
],
[
- 218,
- 217
+ 230,
+ 229
],
[
- 218,
- 221
+ 230,
+ 233
],
[
- 226,
- 225
+ 251,
+ 250
],
[
- 226,
- 234
+ 251,
+ 261
],
[
- 229,
- 230
+ 256,
+ 257
],
[
- 229,
- 231
+ 256,
+ 258
],
[
- 231,
- -225
+ 258,
+ -250
],
[
- 231,
- 232
+ 258,
+ 259
],
[
- 235,
- 234
+ 262,
+ 261
],
[
- 235,
- 239
+ 262,
+ 266
],
[
- 236,
- -234
+ 263,
+ -261
],
[
- 236,
- 237
+ 263,
+ 264
],
[
- 240,
- 239
+ 267,
+ 266
],
[
- 240,
- 243
+ 267,
+ 270
],
[
- 244,
- 243
+ 271,
+ 270
],
[
- 244,
- 247
+ 271,
+ 274
],
[
- 248,
- 247
+ 275,
+ 274
],
[
- 248,
- 251
+ 275,
+ 278
],
[
- 252,
- 251
+ 279,
+ 278
],
[
- 252,
- 255
+ 279,
+ 282
],
[
- 256,
- -11
+ 283,
+ 282
],
[
- 256,
- 255
+ 283,
+ 286
+ ],
+ [
+ 287,
+ -21
+ ],
+ [
+ 287,
+ 286
]
],
"missing_branches": []
}
},
"totals": {
- "covered_lines": 182,
- "num_statements": 182,
+ "covered_lines": 202,
+ "num_statements": 202,
"percent_covered": 100.0,
"percent_covered_display": "100",
"missing_lines": 0,
"excluded_lines": 0,
- "num_branches": 68,
+ "num_branches": 70,
"num_partial_branches": 0,
- "covered_branches": 68,
+ "covered_branches": 70,
"missing_branches": 0
}
}
\ No newline at end of file
diff --git a/nrt_pytest_soft_asserts/__init__.py b/nrt_pytest_soft_asserts/__init__.py
index c218a0f..5312f3c 100644
--- a/nrt_pytest_soft_asserts/__init__.py
+++ b/nrt_pytest_soft_asserts/__init__.py
@@ -1,3 +1,3 @@
-__version__ = '1.0.9'
+__version__ = '1.1.0'
diff --git a/nrt_pytest_soft_asserts/soft_asserts.py b/nrt_pytest_soft_asserts/soft_asserts.py
index a7baaed..8d83139 100644
--- a/nrt_pytest_soft_asserts/soft_asserts.py
+++ b/nrt_pytest_soft_asserts/soft_asserts.py
@@ -1,11 +1,21 @@
+import linecache
+import os
from dataclasses import dataclass
from typing import Callable, Optional, List
+import inspect
@dataclass
class Failure:
error: str
step: str
+ file_path: str
+ code_line: str
+ line_number: int
+
+ def __str__(self):
+ return f'{self.error} ' \
+ f'[{self.file_path}: {self.line_number}] {self.code_line}'
class SoftAsserts:
@@ -198,7 +208,9 @@ def assert_all(self):
[failure.step for failure in failures
if failure.step is not None])))
- raise AssertionError('\n'.join([failure.error for failure in failures]))
+ errors = '\n'.join([str(failure) for failure in failures])
+
+ raise AssertionError(f'\n{errors}')
def is_step_in_failure_steps(self, step: str) -> bool:
return step in self.failure_steps
@@ -219,13 +231,28 @@ def failure_steps(self, value):
self.__failure_steps = value
def __append_to_failures(self, error):
- self.__failures.append(Failure(error, self.__current_step))
- self.__print_error_to_log(error)
+
+ file_path, code_line, line_number = \
+ self.__get_failure_file_path_and_line_code_and_line_number()
+
+ failure = \
+ Failure(
+ error=error,
+ step=self.__current_step,
+ file_path=file_path,
+ code_line=code_line,
+ line_number=line_number)
+
+ self.__failures.append(failure)
+
+ self.__print_error_to_log(failure)
@classmethod
- def __print_error_to_log(cls, error):
+ def __print_error_to_log(cls, failure: Failure):
cls.__validate_params()
+ error = str(failure)
+
if cls.__print_method:
cls.__print_method(error)
elif cls.__logger:
@@ -255,3 +282,13 @@ def set_print_method(cls, print_method: Callable):
@classmethod
def unset_print_method(cls):
cls.__print_method = None
+
+ @classmethod
+ def __get_failure_file_path_and_line_code_and_line_number(cls):
+ frame = inspect.currentframe()
+ frame = frame.f_back.f_back.f_back
+ file_path = os.path.relpath(frame.f_code.co_filename)
+ line_number = frame.f_lineno
+ code_line = linecache.getline(file_path, line_number).strip()
+
+ return file_path, code_line, line_number
diff --git a/pyproject.toml b/pyproject.toml
index d120c0d..9564d31 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,7 +1,7 @@
[project]
name='nrt-pytest-soft-asserts'
-version='1.0.9'
+version='1.1.0'
authors=[
{ name='Eyal Tuzon', email='eyal.tuzon.dev@gmail.com' },
]
diff --git a/tests/nrt_pytest_soft_asserts/soft_asserts_test.py b/tests/nrt_pytest_soft_asserts/soft_asserts_test.py
index 92f3875..b714cdc 100644
--- a/tests/nrt_pytest_soft_asserts/soft_asserts_test.py
+++ b/tests/nrt_pytest_soft_asserts/soft_asserts_test.py
@@ -263,7 +263,7 @@ def test_assert_raised_with_fail(before_test):
def test_fail_with_print_message(before_test):
SoftAsserts.set_print_method(__print)
soft_asserts.assert_true(False, ERROR_MESSAGE_1)
- assert print_message == ERROR_MESSAGE_1
+ assert print_message.startswith(ERROR_MESSAGE_1)
__verify_assert_all_raised_exception()