Clone
1
run 2623 TEST commit e37366c
ci-bot edited this page 2025-08-25 23:50:07 +00:00

Test Report

View CI Run 2623 | Commit e37366c

🧪 Test Report

Generated on 2025-08-26 01:49:40 CEST

🧾 General Info

  • duration: 32.223432779312134
  • root: /workspace/tligui_y/slic
  • environment: {}

📋 Summary

  • Passed: 524
  • Failed: 17
  • Total: 541
  • Collected: 541

🔎 Tests

Passed (524)
  • 📄 morbidissimo/morbidissimo/morioc/test_infer_type.py

    Function: test_it_type_str

    • Test 1

      📌 Setup phase

      duration:

      0.0006746426224708557
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00022343825548887253
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020992010831832886
      

      outcome:

      passed
      

    Function: test_it_type_float

    • Test 2

      📌 Setup phase

      duration:

      0.00012312456965446472
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014608632773160934
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010314024984836578
      

      outcome:

      passed
      

    Function: test_it_type_int

    • Test 3

      📌 Setup phase

      duration:

      0.00011174287647008896
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014166999608278275
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010342709720134735
      

      outcome:

      passed
      

    Function: test_it_value_str

    • Test 4

      📌 Setup phase

      duration:

      0.00011138524860143661
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014061853289604187
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.609851986169815e-05
      

      outcome:

      passed
      

    Function: test_it_value_long_str

    • Test 5

      📌 Setup phase

      duration:

      0.0001101084053516388
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013570673763751984
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010106433182954788
      

      outcome:

      passed
      

    Function: test_it_value_float

    • Test 6

      📌 Setup phase

      duration:

      0.00012406054884195328
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015884265303611755
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.70223918557167e-05
      

      outcome:

      passed
      

    Function: test_it_value_int

    • Test 7

      📌 Setup phase

      duration:

      0.00011144764721393585
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015608035027980804
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011475663632154465
      

      outcome:

      passed
      

    Function: test_it_empty_value_str

    • Test 8

      📌 Setup phase

      duration:

      0.00011016987264156342
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013691559433937073
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.606033563613892e-05
      

      outcome:

      passed
      

    Function: test_it_empty_value_float

    • Test 9

      📌 Setup phase

      duration:

      0.00010740477591753006
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001513659954071045
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.703543037176132e-05
      

      outcome:

      passed
      

    Function: test_it_empty_value_int

    • Test 10

      📌 Setup phase

      duration:

      0.00010516960173845291
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013164803385734558
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.44044440984726e-05
      

      outcome:

      passed
      

    Function: test_pstrue_str

    • Test 11

      📌 Setup phase

      duration:

      0.00010857731103897095
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013925880193710327
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010621082037687302
      

      outcome:

      passed
      

    Function: test_pstrue_float

    • Test 12

      📌 Setup phase

      duration:

      0.00010386016219854355
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013540498912334442
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.400956332683563e-05
      

      outcome:

      passed
      

    Function: test_pstrue_int

    • Test 13

      📌 Setup phase

      duration:

      0.00010419916361570358
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001338701695203781
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.694509208202362e-05
      

      outcome:

      passed
      

    Function: test_psfalse_str

    • Test 14

      📌 Setup phase

      duration:

      0.00011087581515312195
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013734027743339539
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.496323764324188e-05
      

      outcome:

      passed
      

    Function: test_psfalse_float

    • Test 15

      📌 Setup phase

      duration:

      0.00010302755981683731
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013315584510564804
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.745638817548752e-05
      

      outcome:

      passed
      

    Function: test_psfalse_int

    • Test 16

      📌 Setup phase

      duration:

      0.00010479334741830826
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014337431639432907
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016219168901443481
      

      outcome:

      passed
      

    Function: test_it_None

    • Test 17

      📌 Setup phase

      duration:

      0.00011541228741407394
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016365107148885727
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.784474968910217e-05
      

      outcome:

      passed
      

    Function: test_it_True

    • Test 18

      📌 Setup phase

      duration:

      0.00010509882122278214
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014499202370643616
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.804219007492065e-05
      

      outcome:

      passed
      

    Function: test_it_False

    • Test 19

      📌 Setup phase

      duration:

      0.0001055421307682991
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002799462527036667
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010150857269763947
      

      outcome:

      passed
      

    Function: test_it_nan

    • Test 20

      📌 Setup phase

      duration:

      0.00010694097727537155
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001448988914489746
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.799469262361526e-05
      

      outcome:

      passed
      

    Function: test_it_np_nan

    • Test 21

      📌 Setup phase

      duration:

      0.00010689534246921539
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001330636441707611
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.429268538951874e-05
      

      outcome:

      passed
      

    Function: test_it_np1D_int

    • Test 22

      📌 Setup phase

      duration:

      0.00010198727250099182
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00019301753491163254
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001164563000202179
      

      outcome:

      passed
      

    Function: test_it_np2D_int

    • Test 23

      📌 Setup phase

      duration:

      0.00011047907173633575
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00017425697296857834
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010787229984998703
      

      outcome:

      passed
      

    Function: test_it_np1D_float

    • Test 24

      📌 Setup phase

      duration:

      0.00010530557483434677
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00024145375937223434
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013289041817188263
      

      outcome:

      passed
      

    Function: test_it_np2D_float

    • Test 25

      📌 Setup phase

      duration:

      0.00011817552149295807
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00020570214837789536
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011198874562978745
      

      outcome:

      passed
      

    Function: test_it_np1D_bool

    • Test 26

      📌 Setup phase

      duration:

      0.00010925810784101486
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016504712402820587
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010126177221536636
      

      outcome:

      passed
      

    Function: test_it_np1D_object

    • Test 27

      📌 Setup phase

      duration:

      0.00010773073881864548
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015014782547950745
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.65707004070282e-05
      

      outcome:

      passed
      

    Function: test_it_np_scalar_int

    • Test 28

      📌 Setup phase

      duration:

      0.00010330602526664734
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016467738896608353
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.49278473854065e-05
      

      outcome:

      passed
      

    Function: test_it_np_scalar_float

    • Test 29

      📌 Setup phase

      duration:

      0.00011826120316982269
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016851909458637238
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010065734386444092
      

      outcome:

      passed
      

    Function: test_it_np_scalar_bool

    • Test 30

      📌 Setup phase

      duration:

      0.00011734757572412491
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001768544316291809
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011883676052093506
      

      outcome:

      passed
      

    Function: test_it_list

    • Test 31

      📌 Setup phase

      duration:

      0.00012744218111038208
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016857311129570007
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001120157539844513
      

      outcome:

      passed
      

    Function: test_it_tuple

    • Test 32

      📌 Setup phase

      duration:

      0.0001240791752934456
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015492551028728485
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010671000927686691
      

      outcome:

      passed
      
  • 📄 test_utils_argfwd.py

    Function: test_split_at

    • Test 33
      params: lst=["a", "b", "c", "d"], index=2, expected="a", "b"], ["c", "d"

      📌 Runtime Parameters

      params:
        lst:
          - a
          - b
          - c
          - d
        index: 2
        expected:
          -       - a
            - b
          -       - c
            - d
      id: lst0-2-expected0
      

      📌 Setup phase

      duration:

      0.00038893334567546844
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015731435269117355
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016460847109556198
      

      outcome:

      passed
      
    • Test 34
      params: lst=["x", "y"], index=1, expected="x"], ["y"

      📌 Runtime Parameters

      params:
        lst:
          - x
          - y
        index: 1
        expected:
          -       - x
          -       - y
      id: lst1-1-expected1
      

      📌 Setup phase

      duration:

      0.00028147734701633453
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016946066170930862
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018704310059547424
      

      outcome:

      passed
      
    • Test 35
      params: lst=[], index=0, expected=], [

      📌 Runtime Parameters

      params:
        lst:
      []
        index: 0
        expected:
          - (vide)
          - (vide)
      id: lst2-0-expected2
      

      📌 Setup phase

      duration:

      0.0002930024638772011
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014247838407754898
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015211664140224457
      

      outcome:

      passed
      

    Function: test_merge_lists_unique

    • Test 36
      params: a=["a", "b"], b=["b", "c"], expected=["a", "b", "c"]

      📌 Runtime Parameters

      params:
        a:
          - a
          - b
        b:
          - b
          - c
        expected:
          - a
          - b
          - c
      id: a0-b0-expected0
      

      📌 Setup phase

      duration:

      0.00026991404592990875
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001449529081583023
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015102699398994446
      

      outcome:

      passed
      
    • Test 37
      params: a=[], b=["x"], expected=["x"]

      📌 Runtime Parameters

      params:
        a:
      []
        b:
          - x
        expected:
          - x
      id: a1-b1-expected1
      

      📌 Setup phase

      duration:

      0.00026051606982946396
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001362403854727745
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017173774540424347
      

      outcome:

      passed
      
    • Test 38
      params: a=["x", "y"], b=["x", "y"], expected=["x", "y"]

      📌 Runtime Parameters

      params:
        a:
          - x
          - y
        b:
          - x
          - y
        expected:
          - x
          - y
      id: a2-b2-expected2
      

      📌 Setup phase

      duration:

      0.00028619077056646347
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001393444836139679
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016823504120111465
      

      outcome:

      passed
      

    Function: test_merge_dicts_unique

    • Test 39
      params: a={"a": 1}, b={"b": 2}, expected={"a": 1, "b": 2}

      📌 Runtime Parameters

      params:
        a:
          a: 1
        b:
          b: 2
        expected:
          a: 1
          b: 2
      id: a0-b0-expected0
      

      📌 Setup phase

      duration:

      0.00027120020240545273
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001534903421998024
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015157461166381836
      

      outcome:

      passed
      
    • Test 40
      params: a={"x": 1}, b={"x": 9, "y": 3}, expected={"x": 1, "y": 3}

      📌 Runtime Parameters

      params:
        a:
          x: 1
        b:
          x: 9
          y: 3
        expected:
          x: 1
          y: 3
      id: a1-b1-expected1
      

      📌 Setup phase

      duration:

      0.0002616541460156441
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00021582748740911484
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015571992844343185
      

      outcome:

      passed
      
    • Test 41
      params: a={}, b={"k": 4}, expected={"k": 4}

      📌 Runtime Parameters

      params:
        a:
      {}
        b:
          k: 4
        expected:
          k: 4
      id: a2-b2-expected2
      

      📌 Setup phase

      duration:

      0.0002736467868089676
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001376532018184662
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001544291153550148
      

      outcome:

      passed
      

    Function: test_make_params_pos_basic

    • Test 42
      params: pos=["a", "b"], expected_names=["a", "b"]

      📌 Runtime Parameters

      params:
        pos:
          - a
          - b
        expected_names:
          - a
          - b
      id: pos0-expected_names0
      

      📌 Setup phase

      duration:

      0.00022971443831920624
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015657488256692886
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001423116773366928
      

      outcome:

      passed
      
    • Test 43
      params: pos=["param1", "value_2", "Z"], expected_names=["param1", "value_2", "Z"]

      📌 Runtime Parameters

      params:
        pos:
          - param1
          - value_2
          - Z
        expected_names:
          - param1
          - value_2
          - Z
      id: pos1-expected_names1
      

      📌 Setup phase

      duration:

      0.00023855548352003098
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016282405704259872
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014239735901355743
      

      outcome:

      passed
      
    • Test 44
      params: pos=[], expected_names=[]

      📌 Runtime Parameters

      params:
        pos:
      []
        expected_names:
      []
      id: pos2-expected_names2
      

      📌 Setup phase

      duration:

      0.00021972227841615677
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001461431384086609
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001478232443332672
      

      outcome:

      passed
      

    Function: test_make_params_kw_basic

    • Test 45
      params: kw={"a": 1, "b": 2}, expected_keys=["a", "b"], expected_defaults=[1, 2]

      📌 Runtime Parameters

      params:
        kw:
          a: 1
          b: 2
        expected_keys:
          - a
          - b
        expected_defaults:
          - 1
          - 2
      id: kw0-expected_keys0-expected_defaults0
      

      📌 Setup phase

      duration:

      0.0002558808773756027
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015632901340723038
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001594778150320053
      

      outcome:

      passed
      
    • Test 46
      params: kw={"param_x": 0}, expected_keys=["param_x"], expected_defaults=[0]

      📌 Runtime Parameters

      params:
        kw:
          param_x: 0
        expected_keys:
          - param_x
        expected_defaults:
          - (vide)
      id: kw1-expected_keys1-expected_defaults1
      

      📌 Setup phase

      duration:

      0.0002697352319955826
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016807019710540771
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015776138752698898
      

      outcome:

      passed
      
    • Test 47
      params: kw={}, expected_keys=[], expected_defaults=[]

      📌 Runtime Parameters

      params:
        kw:
      {}
        expected_keys:
      []
        expected_defaults:
      []
      id: kw2-expected_keys2-expected_defaults2
      

      📌 Setup phase

      duration:

      0.0002636834979057312
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001467941328883171
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016567204147577286
      

      outcome:

      passed
      

    Function: test_make_signature_parametrized

    • Test 48
      params: pos=["x", "y"], kw={"z": 3}, expected_signature="(x, y, z=3)"

      📌 Runtime Parameters

      params:
        pos:
          - x
          - y
        kw:
          z: 3
        expected_signature: (x, y, z=3)
      id: pos0-kw0-(x, y, z=3)
      

      📌 Setup phase

      duration:

      0.00031358934938907623
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00019892118871212006
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001710718497633934
      

      outcome:

      passed
      
    • Test 49
      params: pos=["a"], kw={"b": 1, "c": 2}, expected_signature="(a, b=1, c=2)"

      📌 Runtime Parameters

      params:
        pos:
          - a
        kw:
          b: 1
          c: 2
        expected_signature: (a, b=1, c=2)
      id: pos1-kw1-(a, b=1, c=2)
      

      📌 Setup phase

      duration:

      0.0002668974921107292
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00024471618235111237
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00021616462618112564
      

      outcome:

      passed
      
    • Test 50
      params: pos=[], kw={"flag": false}, expected_signature="(flag=False)"

      📌 Runtime Parameters

      params:
        pos:
      []
        kw:
          flag: False
        expected_signature: (flag=False)
      id: pos2-kw2-(flag=False)
      

      📌 Setup phase

      duration:

      0.00031148456037044525
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001777317374944687
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001617148518562317
      

      outcome:

      passed
      

    Function: test_get_args_parametrized

    • Test 51
      params: func=" at 0x7fe1c5ef68b0>", expected_pos=["a", "b"], expected_kw={"c": 3, "d": 4}

      📌 Runtime Parameters

      params:
        func: <function <lambda> at 0x7fe1c5ef68b0>
        expected_pos:
          - a
          - b
        expected_kw:
          c: 3
          d: 4
      id: <lambda>-expected_pos0-expected_kw0
      

      📌 Setup phase

      duration:

      0.00027800165116786957
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00019628647714853287
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020720437169075012
      

      outcome:

      passed
      
    • Test 52
      params: func=" at 0x7fe1c5efb820>", expected_pos=[], expected_kw="{'x': 1, 'y': , 'z': 0}"

      📌 Runtime Parameters

      params:
        func: <function <lambda> at 0x7fe1c5efb820>
        expected_pos:
      []
        expected_kw: {'x': 1, 'y': <class 'inspect._empty'>, 'z': 0}
      id: <lambda>-expected_pos1-expected_kw1
      

      📌 Setup phase

      duration:

      0.0002898089587688446
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00023181084543466568
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017497967928647995
      

      outcome:

      passed
      
    • Test 53
      params: func=" at 0x7fe1c5efb940>", expected_pos=[], expected_kw={}

      📌 Runtime Parameters

      params:
        func: <function <lambda> at 0x7fe1c5efb940>
        expected_pos:
      []
        expected_kw:
      {}
      id: <lambda>-expected_pos2-expected_kw2
      

      📌 Setup phase

      duration:

      0.00029980018734931946
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018729176372289658
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001603737473487854
      

      outcome:

      passed
      

    Function: test_signature_visible

    • Test 54
      params: func="", expected_sig="(a, b, d=30, c=10)"

      📌 Runtime Parameters

      params:
        func: <function wrap_all at 0x7fe1c5efbb80>
        expected_sig: (a, b, d=30, c=10)
      id: wrap_all-(a, b, d=30, c=10)
      

      📌 Setup phase

      duration:

      0.00022892002016305923
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00022452324628829956
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00022075418382883072
      

      outcome:

      passed
      
    • Test 55
      params: func="", expected_sig="(a, b, c=10, d=20)"

      📌 Runtime Parameters

      params:
        func: <function wrap_skip at 0x7fe1c5efbc10>
        expected_sig: (a, b, c=10, d=20)
      id: wrap_skip-(a, b, c=10, d=20)
      

      📌 Setup phase

      duration:

      0.00026414357125759125
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018778908997774124
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014396756887435913
      

      outcome:

      passed
      
    • Test 56
      params: func="", expected_sig="(x, y, c=10, d=20)"

      📌 Runtime Parameters

      params:
        func: <function wrap_ignore_all at 0x7fe1c5efbca0>
        expected_sig: (x, y, c=10, d=20)
      id: wrap_ignore_all-(x, y, c=10, d=20)
      

      📌 Setup phase

      duration:

      0.00022786390036344528
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015902332961559296
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013977661728858948
      

      outcome:

      passed
      

    Function: test_wrapper_behavior

    • Test 57
      params: func="", args=[1, 2, 3], kwargs={}, expected_result=36

      📌 Runtime Parameters

      params:
        func: <function wrap_all at 0x7fe1c5efbb80>
        args:
          - 1
          - 2
          - 3
        kwargs:
      {}
        expected_result: 36
      id: wrap_all-args0-kwargs0-36
      

      📌 Setup phase

      duration:

      0.0004475787281990051
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015977118164300919
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017285998910665512
      

      outcome:

      passed
      
    • Test 58
      params: func="", args=[1, 2, 3], kwargs={"d": 5}, expected_result=11

      📌 Runtime Parameters

      params:
        func: <function wrap_all at 0x7fe1c5efbb80>
        args:
          - 1
          - 2
          - 3
        kwargs:
          d: 5
        expected_result: 11
      id: wrap_all-args1-kwargs1-11
      

      📌 Setup phase

      duration:

      0.0003076596185564995
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014281179755926132
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017510820180177689
      

      outcome:

      passed
      
    • Test 59
      params: func="", args=[0, 0], kwargs={"c": 3, "d": 4}, expected_result=10

      📌 Runtime Parameters

      params:
        func: <function wrap_skip at 0x7fe1c5efbc10>
        args:
          - (vide)
          - (vide)
        kwargs:
          c: 3
          d: 4
        expected_result: 10
      id: wrap_skip-args2-kwargs2-10
      

      📌 Setup phase

      duration:

      0.0002975054085254669
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001532202586531639
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017289631068706512
      

      outcome:

      passed
      
    • Test 60
      params: func="", args=[0, 0], kwargs={}, expected_result=10

      📌 Runtime Parameters

      params:
        func: <function wrap_ignore_all at 0x7fe1c5efbca0>
        args:
          - (vide)
          - (vide)
        kwargs:
      {}
        expected_result: 10
      id: wrap_ignore_all-args3-kwargs3-10
      

      📌 Setup phase

      duration:

      0.00033729150891304016
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001378459855914116
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016494188457727432
      

      outcome:

      passed
      
  • 📄 test_utils_ask_yes_no.py

    Function: test_ask_yes_no

    • Test 61
      params: default=null, user_input="y", expected_output=true, expected_prompt="Question? [y/n] "

      📌 Runtime Parameters

      params:
        default: None
        user_input: y
        expected_output: True
        expected_prompt: Question? [y/n] 
      id: None-y-True-Question? [y/n] 
      

      📌 Setup phase

      duration:

      0.0003286963328719139
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000842689536511898
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019143708050251007
      

      outcome:

      passed
      
    • Test 62
      params: default=null, user_input="yes", expected_output=true, expected_prompt="Question? [y/n] "

      📌 Runtime Parameters

      params:
        default: None
        user_input: yes
        expected_output: True
        expected_prompt: Question? [y/n] 
      id: None-yes-True-Question? [y/n] 
      

      📌 Setup phase

      duration:

      0.0003225887194275856
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005605807527899742
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018500816076993942
      

      outcome:

      passed
      
    • Test 63
      params: default=null, user_input="n", expected_output=false, expected_prompt="Question? [y/n] "

      📌 Runtime Parameters

      params:
        default: None
        user_input: n
        expected_output: False
        expected_prompt: Question? [y/n] 
      id: None-n-False-Question? [y/n] 
      

      📌 Setup phase

      duration:

      0.00033280346542596817
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005128867924213409
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019282102584838867
      

      outcome:

      passed
      
    • Test 64
      params: default=null, user_input="no", expected_output=false, expected_prompt="Question? [y/n] "

      📌 Runtime Parameters

      params:
        default: None
        user_input: no
        expected_output: False
        expected_prompt: Question? [y/n] 
      id: None-no-False-Question? [y/n] 
      

      📌 Setup phase

      duration:

      0.0003149276599287987
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006193853914737701
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018064025789499283
      

      outcome:

      passed
      
    • Test 65
      params: default=null, user_input=["maybe", "y"], expected_output=true, expected_prompt="Question? [y/n] "

      📌 Runtime Parameters

      params:
        default: None
        user_input:
          - maybe
          - y
        expected_output: True
        expected_prompt: Question? [y/n] 
      id: None-user_input4-True-Question? [y/n] 
      

      📌 Setup phase

      duration:

      0.00032183434814214706
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005366001278162003
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017908494919538498
      

      outcome:

      passed
      
    • Test 66
      params: default=null, user_input=["", "no"], expected_output=false, expected_prompt="Question? [y/n] "

      📌 Runtime Parameters

      params:
        default: None
        user_input:
          - (vide)
          - no
        expected_output: False
        expected_prompt: Question? [y/n] 
      id: None-user_input5-False-Question? [y/n] 
      

      📌 Setup phase

      duration:

      0.0003314092755317688
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005171485245227814
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018656998872756958
      

      outcome:

      passed
      
    • Test 67
      params: default=null, user_input=["invalid", "", "invalid", "yes"], expected_output=true, expected_prompt="Question? [y/n] "

      📌 Runtime Parameters

      params:
        default: None
        user_input:
          - invalid
          - (vide)
          - invalid
          - yes
        expected_output: True
        expected_prompt: Question? [y/n] 
      id: None-user_input6-True-Question? [y/n] 
      

      📌 Setup phase

      duration:

      0.0003441041335463524
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005613407120108604
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019234325736761093
      

      outcome:

      passed
      
    • Test 68
      params: default="y", user_input="y", expected_output=true, expected_prompt="Question? [Y/n] "

      📌 Runtime Parameters

      params:
        default: y
        user_input: y
        expected_output: True
        expected_prompt: Question? [Y/n] 
      id: y-y-True-Question? [Y/n] 
      

      📌 Setup phase

      duration:

      0.0003195377066731453
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006198221817612648
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018342677503824234
      

      outcome:

      passed
      
    • Test 69
      params: default="y", user_input="n", expected_output=false, expected_prompt="Question? [Y/n] "

      📌 Runtime Parameters

      params:
        default: y
        user_input: n
        expected_output: False
        expected_prompt: Question? [Y/n] 
      id: y-n-False-Question? [Y/n] 
      

      📌 Setup phase

      duration:

      0.0003155600279569626
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005004797130823135
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018574390560388565
      

      outcome:

      passed
      
    • Test 70
      params: default="y", user_input="", expected_output=true, expected_prompt="Question? [Y/n] "

      📌 Runtime Parameters

      params:
        default: y
        user_input: None
        expected_output: True
        expected_prompt: Question? [Y/n] 
      id: y--True-Question? [Y/n] 
      

      📌 Setup phase

      duration:

      0.0003342796117067337
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005032895132899284
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019270554184913635
      

      outcome:

      passed
      
    • Test 71
      params: default="n", user_input="y", expected_output=true, expected_prompt="Question? [y/N] "

      📌 Runtime Parameters

      params:
        default: n
        user_input: y
        expected_output: True
        expected_prompt: Question? [y/N] 
      id: n-y-True-Question? [y/N] 
      

      📌 Setup phase

      duration:

      0.00032929517328739166
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005158130079507828
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018300116062164307
      

      outcome:

      passed
      
    • Test 72
      params: default="n", user_input="n", expected_output=false, expected_prompt="Question? [y/N] "

      📌 Runtime Parameters

      params:
        default: n
        user_input: n
        expected_output: False
        expected_prompt: Question? [y/N] 
      id: n-n-False-Question? [y/N] 
      

      📌 Setup phase

      duration:

      0.00032573286443948746
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005968259647488594
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018867850303649902
      

      outcome:

      passed
      
    • Test 73
      params: default="n", user_input="", expected_output=false, expected_prompt="Question? [y/N] "

      📌 Runtime Parameters

      params:
        default: n
        user_input: None
        expected_output: False
        expected_prompt: Question? [y/N] 
      id: n--False-Question? [y/N] 
      

      📌 Setup phase

      duration:

      0.0003246655687689781
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005182409659028053
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002117697149515152
      

      outcome:

      passed
      

    Function: test_ask_yes_no_ctrl_c

    • Test 74
      params: default=null, user_input="", expected_output=false, ctrl_c="n"

      📌 Runtime Parameters

      params:
        default: None
        user_input: <class 'KeyboardInterrupt'>
        expected_output: False
        ctrl_c: n
      id: None-KeyboardInterrupt-False-n
      

      📌 Setup phase

      duration:

      0.0003198524937033653
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000530327670276165
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001865290105342865
      

      outcome:

      passed
      
    • Test 75
      params: default=null, user_input="", expected_output=true, ctrl_c="y"

      📌 Runtime Parameters

      params:
        default: None
        user_input: <class 'KeyboardInterrupt'>
        expected_output: True
        ctrl_c: y
      id: None-KeyboardInterrupt-True-y
      

      📌 Setup phase

      duration:

      0.00032792147248983383
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000613323412835598
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018676649779081345
      

      outcome:

      passed
      
    • Test 76
      params: default="y", user_input="", expected_output=false, ctrl_c="n"

      📌 Runtime Parameters

      params:
        default: y
        user_input: <class 'KeyboardInterrupt'>
        expected_output: False
        ctrl_c: n
      id: y-KeyboardInterrupt-False-n
      

      📌 Setup phase

      duration:

      0.00033537670969963074
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0004940787330269814
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018821749836206436
      

      outcome:

      passed
      
    • Test 77
      params: default="y", user_input="", expected_output=true, ctrl_c="y"

      📌 Runtime Parameters

      params:
        default: y
        user_input: <class 'KeyboardInterrupt'>
        expected_output: True
        ctrl_c: y
      id: y-KeyboardInterrupt-True-y
      

      📌 Setup phase

      duration:

      0.0003178296610713005
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005333581939339638
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002273591235280037
      

      outcome:

      passed
      
    • Test 78
      params: default="n", user_input="", expected_output=false, ctrl_c="n"

      📌 Runtime Parameters

      params:
        default: n
        user_input: <class 'KeyboardInterrupt'>
        expected_output: False
        ctrl_c: n
      id: n-KeyboardInterrupt-False-n
      

      📌 Setup phase

      duration:

      0.00032269954681396484
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005267681553959846
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018049776554107666
      

      outcome:

      passed
      
    • Test 79
      params: default=null, user_input="['invalid', '', 'invalid', ]", expected_output=false, ctrl_c="n"

      📌 Runtime Parameters

      params:
        default: None
        user_input: ['invalid', '', 'invalid', <class 'KeyboardInterrupt'>]
        expected_output: False
        ctrl_c: n
      id: None-user_input5-False-n
      

      📌 Setup phase

      duration:

      0.00032628607004880905
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006366465240716934
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018544215708971024
      

      outcome:

      passed
      
    • Test 80
      params: default=null, user_input="['invalid', '', 'invalid', ]", expected_output=true, ctrl_c="y"

      📌 Runtime Parameters

      params:
        default: None
        user_input: ['invalid', '', 'invalid', <class 'KeyboardInterrupt'>]
        expected_output: True
        ctrl_c: y
      id: None-user_input6-True-y
      

      📌 Setup phase

      duration:

      0.0003358973190188408
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005251243710517883
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018565356731414795
      

      outcome:

      passed
      
    • Test 81
      params: default=null, user_input="['foo', '', , '', 'invalid', , 'no']", expected_output=false, ctrl_c=null

      📌 Runtime Parameters

      params:
        default: None
        user_input: ['foo', '', <class 'KeyboardInterrupt'>, '', 'invalid', <class 'KeyboardInterrupt'>, 'no']
        expected_output: False
        ctrl_c: None
      id: None-user_input7-False-None
      

      📌 Setup phase

      duration:

      0.0003189798444509506
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005805259570479393
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018704403191804886
      

      outcome:

      passed
      
    • Test 82
      params: default="n", user_input="[, , , '']", expected_output=false, ctrl_c=null

      📌 Runtime Parameters

      params:
        default: n
        user_input: [<class 'KeyboardInterrupt'>, <class 'KeyboardInterrupt'>, <class 'KeyboardInterrupt'>, '']
        expected_output: False
        ctrl_c: None
      id: n-user_input8-False-None
      

      📌 Setup phase

      duration:

      0.0003220047801733017
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0007539363577961922
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0003338884562253952
      

      outcome:

      passed
      
    • Test 83
      params: default="n", user_input="[, , , '']", expected_output=false, ctrl_c="Invalid"

      📌 Runtime Parameters

      params:
        default: n
        user_input: [<class 'KeyboardInterrupt'>, <class 'KeyboardInterrupt'>, <class 'KeyboardInterrupt'>, '']
        expected_output: False
        ctrl_c: Invalid
      id: n-user_input9-False-Invalid
      

      📌 Setup phase

      duration:

      0.0003386596217751503
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005644252523779869
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018890947103500366
      

      outcome:

      passed
      

    Function: test_ask_yes_no_ctrl_d

    • Test 84
      params: default=null, user_input="", expected_output=false, ctrl_d="n"

      📌 Runtime Parameters

      params:
        default: None
        user_input: <class 'EOFError'>
        expected_output: False
        ctrl_d: n
      id: None-EOFError-False-n
      

      📌 Setup phase

      duration:

      0.0003264863044023514
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005144942551851273
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020412728190422058
      

      outcome:

      passed
      
    • Test 85
      params: default=null, user_input="", expected_output=true, ctrl_d="y"

      📌 Runtime Parameters

      params:
        default: None
        user_input: <class 'EOFError'>
        expected_output: True
        ctrl_d: y
      id: None-EOFError-True-y
      

      📌 Setup phase

      duration:

      0.00034582987427711487
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005113184452056885
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001886766403913498
      

      outcome:

      passed
      
    • Test 86
      params: default="y", user_input="", expected_output=true, ctrl_d="y"

      📌 Runtime Parameters

      params:
        default: y
        user_input: <class 'EOFError'>
        expected_output: True
        ctrl_d: y
      id: y-EOFError-True-y
      

      📌 Setup phase

      duration:

      0.00033620838075876236
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0011060535907745361
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018338672816753387
      

      outcome:

      passed
      
    • Test 87
      params: default="n", user_input="", expected_output=true, ctrl_d="y"

      📌 Runtime Parameters

      params:
        default: n
        user_input: <class 'EOFError'>
        expected_output: True
        ctrl_d: y
      id: n-EOFError-True-y
      

      📌 Setup phase

      duration:

      0.00033670850098133087
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005007181316614151
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019141100347042084
      

      outcome:

      passed
      
    • Test 88
      params: default="n", user_input="", expected_output=false, ctrl_d="n"

      📌 Runtime Parameters

      params:
        default: n
        user_input: <class 'EOFError'>
        expected_output: False
        ctrl_d: n
      id: n-EOFError-False-n
      

      📌 Setup phase

      duration:

      0.0003197118639945984
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0004902631044387817
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019325688481330872
      

      outcome:

      passed
      
    • Test 89
      params: default=null, user_input="['foo', ]", expected_output=true, ctrl_d="y"

      📌 Runtime Parameters

      params:
        default: None
        user_input: ['foo', <class 'EOFError'>]
        expected_output: True
        ctrl_d: y
      id: None-user_input5-True-y
      

      📌 Setup phase

      duration:

      0.00037395767867565155
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005376320332288742
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018880143761634827
      

      outcome:

      passed
      
    • Test 90
      params: default=null, user_input="['foo', ]", expected_output=false, ctrl_d="n"

      📌 Runtime Parameters

      params:
        default: None
        user_input: ['foo', <class 'EOFError'>]
        expected_output: False
        ctrl_d: n
      id: None-user_input6-False-n
      

      📌 Setup phase

      duration:

      0.0003228066489100456
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006268220022320747
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018899142742156982
      

      outcome:

      passed
      
    • Test 91
      params: default="y", user_input="", expected_output=true, ctrl_d=null

      📌 Runtime Parameters

      params:
        default: y
        user_input: <class 'EOFError'>
        expected_output: True
        ctrl_d: None
      id: y-EOFError-True-None
      

      📌 Setup phase

      duration:

      0.0003295931965112686
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0004938235506415367
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018080789595842361
      

      outcome:

      passed
      
    • Test 92
      params: default="n", user_input="", expected_output=false, ctrl_d=null

      📌 Runtime Parameters

      params:
        default: n
        user_input: <class 'EOFError'>
        expected_output: False
        ctrl_d: None
      id: n-EOFError-False-None
      

      📌 Setup phase

      duration:

      0.00031383801251649857
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005035558715462685
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017692707479000092
      

      outcome:

      passed
      
    • Test 93
      params: default=null, user_input="['invalid', 'ok', '', , 'ok', 'y']", expected_output=true, ctrl_d=null

      📌 Runtime Parameters

      params:
        default: None
        user_input: ['invalid', 'ok', '', <class 'EOFError'>, 'ok', 'y']
        expected_output: True
        ctrl_d: None
      id: None-user_input9-True-None
      

      📌 Setup phase

      duration:

      0.00030406098812818527
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006641112267971039
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018325913697481155
      

      outcome:

      passed
      
    • Test 94
      params: default="n", user_input="['no', ]", expected_output=false, ctrl_d=null

      📌 Runtime Parameters

      params:
        default: n
        user_input: ['no', <class 'EOFError'>]
        expected_output: False
        ctrl_d: None
      id: n-user_input10-False-None
      

      📌 Setup phase

      duration:

      0.0003386233001947403
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00048738904297351837
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018132850527763367
      

      outcome:

      passed
      
    • Test 95
      params: default=null, user_input="[, , , 'y']", expected_output=true, ctrl_d=null

      📌 Runtime Parameters

      params:
        default: None
        user_input: [<class 'EOFError'>, <class 'EOFError'>, <class 'EOFError'>, 'y']
        expected_output: True
        ctrl_d: None
      id: None-user_input11-True-None
      

      📌 Setup phase

      duration:

      0.0003144824877381325
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005306247621774673
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020178314298391342
      

      outcome:

      passed
      
    • Test 96
      params: default=null, user_input="['invalid', '', 'nope', ]", expected_output=false, ctrl_d="n"

      📌 Runtime Parameters

      params:
        default: None
        user_input: ['invalid', '', 'nope', <class 'EOFError'>]
        expected_output: False
        ctrl_d: n
      id: None-user_input12-False-n
      

      📌 Setup phase

      duration:

      0.00031902920454740524
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005456516519188881
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018176622688770294
      

      outcome:

      passed
      
    • Test 97
      params: default=null, user_input="['nope', 'nope', ]", expected_output=true, ctrl_d="y"

      📌 Runtime Parameters

      params:
        default: None
        user_input: ['nope', 'nope', <class 'EOFError'>]
        expected_output: True
        ctrl_d: y
      id: None-user_input13-True-y
      

      📌 Setup phase

      duration:

      0.0003274260088801384
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006257444620132446
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018005352467298508
      

      outcome:

      passed
      

    Function: test_ask_yes_no_mixed_sequences

    • Test 98
      params: default=null, ctrl_c="invalid", ctrl_d=null, user_input="['what', '', 'nope', , 'ok', , 'no']", expected_output=false

      📌 Runtime Parameters

      params:
        default: None
        ctrl_c: invalid
        ctrl_d: None
        user_input: ['what', '', 'nope', <class 'KeyboardInterrupt'>, 'ok', <class 'EOFError'>, 'no']
        expected_output: False
      id: None-invalid-None-user_input0-False
      

      📌 Setup phase

      duration:

      0.0003752792254090309
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005544787272810936
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.000203058123588562
      

      outcome:

      passed
      
    • Test 99
      params: default=null, ctrl_c=null, ctrl_d="notananswer", user_input="['maybe', , 'nop', 'yep', , 'yes']", expected_output=true

      📌 Runtime Parameters

      params:
        default: None
        ctrl_c: None
        ctrl_d: notananswer
        user_input: ['maybe', <class 'KeyboardInterrupt'>, 'nop', 'yep', <class 'EOFError'>, 'yes']
        expected_output: True
      id: None-None-notananswer-user_input1-True
      

      📌 Setup phase

      duration:

      0.00035990960896015167
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005581900477409363
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00021742656826972961
      

      outcome:

      passed
      
    • Test 100
      params: default=null, ctrl_c="n", ctrl_d="nop", user_input="['ok', , , 'maybe', , 'nah', ]", expected_output=false

      📌 Runtime Parameters

      params:
        default: None
        ctrl_c: n
        ctrl_d: nop
        user_input: ['ok', <class 'EOFError'>, <class 'EOFError'>, 'maybe', <class 'EOFError'>, 'nah', <class 'KeyboardInterrupt'>]
        expected_output: False
      id: None-n-nop-user_input2-False
      

      📌 Setup phase

      duration:

      0.00036688055843114853
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006744591519236565
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020484253764152527
      

      outcome:

      passed
      
  • 📄 test_utils_channels.py

    Function: test_load_channels_and_channels_class_with_professional_names

    • Test 101

      📌 Setup phase

      duration:

      0.00013016071170568466
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0009726257994771004
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001170765608549118
      

      outcome:

      passed
      
  • 📄 test_utils_config.py

    Function: test_config_with_nested_and_list_data

    • Test 102

      📌 Setup phase

      duration:

      0.0001276722177863121
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005999580025672913
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011574849486351013
      

      outcome:

      passed
      

    Function: test_config_with_strange_and_edge_keys

    • Test 103

      📌 Setup phase

      duration:

      0.00011165346950292587
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000718078576028347
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012131873518228531
      

      outcome:

      passed
      
  • 📄 test_utils_cpint.py

    Function: test_load_color_variants_all_keys_and_types

    • Test 104
      params: base_color="red"

      📌 Runtime Parameters

      params:
        base_color: red
      id: red
      

      📌 Setup phase

      duration:

      0.00020614080131053925
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015956629067659378
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014173053205013275
      

      outcome:

      passed
      
    • Test 105
      params: base_color="blue"

      📌 Runtime Parameters

      params:
        base_color: blue
      id: blue
      

      📌 Setup phase

      duration:

      0.00017968565225601196
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00017321202903985977
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012148730456829071
      

      outcome:

      passed
      
    • Test 106
      params: base_color="yellow"

      📌 Runtime Parameters

      params:
        base_color: yellow
      id: yellow
      

      📌 Setup phase

      duration:

      0.00016675330698490143
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00017218571156263351
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012533459812402725
      

      outcome:

      passed
      
    • Test 107
      params: base_color="green"

      📌 Runtime Parameters

      params:
        base_color: green
      id: green
      

      📌 Setup phase

      duration:

      0.00017132330685853958
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015527289360761642
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011937692761421204
      

      outcome:

      passed
      
    • Test 108
      params: base_color="cyan"

      📌 Runtime Parameters

      params:
        base_color: cyan
      id: cyan
      

      📌 Setup phase

      duration:

      0.0001810966059565544
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001676604151725769
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012078974395990372
      

      outcome:

      passed
      
    • Test 109
      params: base_color="magenta"

      📌 Runtime Parameters

      params:
        base_color: magenta
      id: magenta
      

      📌 Setup phase

      duration:

      0.00016697216778993607
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015684589743614197
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001290431246161461
      

      outcome:

      passed
      
    • Test 110
      params: base_color="white"

      📌 Runtime Parameters

      params:
        base_color: white
      id: white
      

      📌 Setup phase

      duration:

      0.00017145369201898575
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001679612323641777
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011981464922428131
      

      outcome:

      passed
      
    • Test 111
      params: base_color="black"

      📌 Runtime Parameters

      params:
        base_color: black
      id: black
      

      📌 Setup phase

      duration:

      0.00017524417489767075
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018208380788564682
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012350641191005707
      

      outcome:

      passed
      

    Function: test_cprint_all_cases_fancy

    • Test 112
      params: objects=[["Fancy", "list"], {"a": 7}, null], color_spec=["red", "+"], sep=" | ", expected_flatten="['Fancy', 'list'] | {'a': 7} | None", expected_error=null

      📌 Runtime Parameters

      params:
        objects:
          -       - Fancy
            - list
          -       a: 7
          - (vide)
        color_spec:
          - red
          - +
        sep:  | 
        expected_flatten: ['Fancy', 'list'] | {'a': 7} | None
        expected_error: None
      id: objects0-color_spec0- | -['Fancy', 'list'] | {'a': 7} | None-None
      

      📌 Setup phase

      duration:

      0.0006197141483426094
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00024707429111003876
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002760486677289009
      

      outcome:

      passed
      
    • Test 113
      params: objects=[{"k": [1, 2]}, 99, ["X", ["Y"]]], color_spec=["blue", "++"], sep=" - ", expected_flatten="{'k': [1, 2]} - 99 - ['X', ['Y']]", expected_error=null

      📌 Runtime Parameters

      params:
        objects:
          -       k:
              - 1
              - 2
          - 99
          -       - X
            -         - Y
        color_spec:
          - blue
          - ++
        sep:  - 
        expected_flatten: {'k': [1, 2]} - 99 - ['X', ['Y']]
        expected_error: None
      id: objects1-color_spec1- - -{'k': [1, 2]} - 99 - ['X', ['Y']]-None
      

      📌 Setup phase

      duration:

      0.0004717344418168068
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002269688993692398
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002542436122894287
      

      outcome:

      passed
      
    • Test 114
      params: objects=[[], {}, "End"], color_spec=["magenta", "--"], sep=" / ", expected_flatten="[] / {} / End", expected_error=null

      📌 Runtime Parameters

      params:
        objects:
          - (vide)
          - (vide)
          - End
        color_spec:
          - magenta
          - --
        sep:  / 
        expected_flatten: [] / {} / End
        expected_error: None
      id: objects2-color_spec2- / -[] / {} / End-None
      

      📌 Setup phase

      duration:

      0.0004588048905134201
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00021939631551504135
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002463720738887787
      

      outcome:

      passed
      
    • Test 115
      params: objects="", [3, 4, "done", 0], color_spec=["green", ""], sep=";", expected_flatten="['', [3, 4]];done;0", expected_error=null

      📌 Runtime Parameters

      params:
        objects:
          -       - (vide)
            -         - 3
              - 4
          - done
          - (vide)
        color_spec:
          - green
          - (vide)
        sep: ;
        expected_flatten: ['', [3, 4]];done;0
        expected_error: None
      id: objects3-color_spec3-;-['', [3, 4]];done;0-None
      

      📌 Setup phase

      duration:

      0.000468437559902668
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00021939072757959366
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002490971237421036
      

      outcome:

      passed
      
    • Test 116
      params: objects=[["alpha", null], ["beta", {}], "stop"], color_spec=["yellow", ""], sep="::", expected_flatten="['alpha', None]::['beta', {}]::stop", expected_error=null

      📌 Runtime Parameters

      params:
        objects:
          -       - alpha
            - (vide)
          -       - beta
            - (vide)
          - stop
        color_spec:
          - yellow
          - (vide)
        sep: ::
        expected_flatten: ['alpha', None]::['beta', {}]::stop
        expected_error: None
      id: objects4-color_spec4-::-['alpha', None]::['beta', {}]::stop-None
      

      📌 Setup phase

      duration:

      0.0004506763070821762
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00022437702864408493
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00023620761930942535
      

      outcome:

      passed
      
    • Test 117
      params: objects="deep", ["deeper", ["deepest"], "X"], color_spec=["cyan", "+"], sep=" ... ", expected_flatten="['deep', ['deeper', ['deepest']]] ... X", expected_error=null

      📌 Runtime Parameters

      params:
        objects:
          -       - deep
            -         - deeper
              -           - deepest
          - X
        color_spec:
          - cyan
          - +
        sep:  ... 
        expected_flatten: ['deep', ['deeper', ['deepest']]] ... X
        expected_error: None
      id: objects5-color_spec5- ... -['deep', ['deeper', ['deepest']]] ... X-None
      

      📌 Setup phase

      duration:

      0.0006703808903694153
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002728039398789406
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00026303157210350037
      

      outcome:

      passed
      
    • Test 118
      params: objects=[{"dict": {"nested": [4, 5]}}, [true, false], 6.28], color_spec=["white", "++"], sep=" // ", expected_flatten="{'dict': {'nested': [4, 5]}} // [True, False] // 6.28", expected_error=null

      📌 Runtime Parameters

      params:
        objects:
          -       dict:
              nested:
                - 4
                - 5
          -       - True
            - (vide)
          - 6.28
        color_spec:
          - white
          - ++
        sep:  // 
        expected_flatten: {'dict': {'nested': [4, 5]}} // [True, False] // 6.28
        expected_error: None
      id: objects6-color_spec6- // -{'dict': {'nested': [4, 5]}} // [True, False] // 6.28-None
      

      📌 Setup phase

      duration:

      0.00046868156641721725
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00022892188280820847
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.000261782668530941
      

      outcome:

      passed
      
    • Test 119
      params: objects="A", ["B", "string", "C"], color_spec=["red", "--"], sep="==", expected_flatten="['A', ['B']]==string==C", expected_error=null

      📌 Runtime Parameters

      params:
        objects:
          -       - A
            -         - B
          - string
          - C
        color_spec:
          - red
          - --
        sep: ==
        expected_flatten: ['A', ['B']]==string==C
        expected_error: None
      id: objects7-color_spec7-==-['A', ['B']]==string==C-None
      

      📌 Setup phase

      duration:

      0.0005324278026819229
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00023342762142419815
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002429736778140068
      

      outcome:

      passed
      
    • Test 120
      params: objects="Test", null, [, {"v": 0}], color_spec=["green", "++"], sep=" ++ ", expected_flatten="['Test', None, []] ++ {'v': 0}", expected_error=null

      📌 Runtime Parameters

      params:
        objects:
          -       - Test
            - (vide)
            - (vide)
          -       v: 0
        color_spec:
          - green
          - ++
        sep:  ++ 
        expected_flatten: ['Test', None, []] ++ {'v': 0}
        expected_error: None
      id: objects8-color_spec8- ++ -['Test', None, []] ++ {'v': 0}-None
      

      📌 Setup phase

      duration:

      0.0005627786740660667
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00024660397320985794
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002591768279671669
      

      outcome:

      passed
      
    • Test 121
      params: objects=[["no", "color"], "plain"], color_spec=null, sep=";", expected_flatten="['no', 'color'];plain", expected_error=null

      📌 Runtime Parameters

      params:
        objects:
          -       - no
            - color
          - plain
        color_spec: None
        sep: ;
        expected_flatten: ['no', 'color'];plain
        expected_error: None
      id: objects9-None-;-['no', 'color'];plain-None
      

      📌 Setup phase

      duration:

      0.0004617702215909958
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00021303072571754456
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00026015471667051315
      

      outcome:

      passed
      
    • Test 122
      params: objects=[["simple"], "", 12], color_spec=null, sep=" | ", expected_flatten="['simple'] | | 12", expected_error=null

      📌 Runtime Parameters

      params:
        objects:
          -       - simple
          - (vide)
          - 12
        color_spec: None
        sep:  | 
        expected_flatten: ['simple'] |  | 12
        expected_error: None
      id: objects10-None- | -['simple'] |  | 12-None
      

      📌 Setup phase

      duration:

      0.0004545552656054497
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002318359911441803
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00025026220828294754
      

      outcome:

      passed
      
    • Test 123
      params: objects=["very", "deep", {"ok": true}], color_spec=null, sep=" : ", expected_flatten="'very', 'deep' : {'ok': True}", expected_error=null

      📌 Runtime Parameters

      params:
        objects:
          -       -         - very
              - deep
          -       ok: True
        color_spec: None
        sep:  : 
        expected_flatten: [['very', 'deep']] : {'ok': True}
        expected_error: None
      id: objects11-None- : -[['very', 'deep']] : {'ok': True}-None
      

      📌 Setup phase

      duration:

      0.00046217814087867737
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00021824147552251816
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002529369667172432
      

      outcome:

      passed
      
    • Test 124
      params: objects=[["fail", "color"], 123], color_spec=["green", "!!"], sep="|", expected_flatten="['fail', 'color']|123", expected_error=""

      📌 Runtime Parameters

      params:
        objects:
          -       - fail
            - color
          - 123
        color_spec:
          - green
          - !!
        sep: |
        expected_flatten: ['fail', 'color']|123
        expected_error: <class 'ValueError'>
      id: objects12-color_spec12-|-['fail', 'color']|123-ValueError
      

      📌 Setup phase

      duration:

      0.0004499489441514015
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002431413158774376
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00024559348821640015
      

      outcome:

      passed
      
    • Test 125
      params: objects=[["error"], {}], color_spec=["cyan", "xxx"], sep=" * ", expected_flatten="['error'] * {}", expected_error=""

      📌 Runtime Parameters

      params:
        objects:
          -       - error
          - (vide)
        color_spec:
          - cyan
          - xxx
        sep:  * 
        expected_flatten: ['error'] * {}
        expected_error: <class 'ValueError'>
      id: objects13-color_spec13- * -['error'] * {}-ValueError
      

      📌 Setup phase

      duration:

      0.00046513136476278305
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00023934617638587952
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00024540163576602936
      

      outcome:

      passed
      
    • Test 126
      params: objects="nope"], ["bad", color_spec=["magenta", "invalid"], sep="//", expected_flatten="['nope']//['bad']", expected_error=""

      📌 Runtime Parameters

      params:
        objects:
          -       - nope
          -       - bad
        color_spec:
          - magenta
          - invalid
        sep: //
        expected_flatten: ['nope']//['bad']
        expected_error: <class 'ValueError'>
      id: objects14-color_spec14-//-['nope']//['bad']-ValueError
      

      📌 Setup phase

      duration:

      0.00046943407505750656
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002459874376654625
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00024218019098043442
      

      outcome:

      passed
      
    • Test 127
      params: objects=["wrong", "base"], color_spec=["notacolor", ""], sep="--", expected_flatten="wrong--base", expected_error=""

      📌 Runtime Parameters

      params:
        objects:
          - wrong
          - base
        color_spec:
          - notacolor
          - (vide)
        sep: --
        expected_flatten: wrong--base
        expected_error: <class 'ValueError'>
      id: objects15-color_spec15----wrong--base-ValueError
      

      📌 Setup phase

      duration:

      0.0004525100812315941
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00022033415734767914
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00025228504091501236
      

      outcome:

      passed
      
  • 📄 test_utils_dbusnotify.py

    Function: test_notify_create

    • Test 128

      📌 Setup phase

      duration:

      0.000591963529586792
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.004411357454955578
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011598784476518631
      

      outcome:

      passed
      

    Function: test_notify_update

    • Test 129

      📌 Setup phase

      duration:

      0.0001292731612920761
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.015576767735183239
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001225396990776062
      

      outcome:

      passed
      

    Function: test_get_server_info

    • Test 130

      📌 Setup phase

      duration:

      0.00013621151447296143
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003798389807343483
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010609347373247147
      

      outcome:

      passed
      

    Function: test_get_capabilities

    • Test 131

      📌 Setup phase

      duration:

      0.000133393332362175
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003772033378481865
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011000875383615494
      

      outcome:

      passed
      

    Function: test_notify_and_close

    • Test 132

      📌 Setup phase

      duration:

      0.00012337416410446167
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.20384704321622849
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019842665642499924
      

      outcome:

      passed
      

    Function: test_notify_invalid_value

    • Test 133

      📌 Setup phase

      duration:

      0.00016312487423419952
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00047636963427066803
      

      outcome:

      passed
      

      log:

      -   name: dbus.connection
        msg: Unable to set arguments ('', 0, '', 'Invalid Test', 1234, (), {}, 0) according to signature 'susssasa{sv}i': <class 'TypeError'>: Expected a string or unicode object
        args: None
        levelname: ERROR
        levelno: 40
        pathname: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/dbus/connection.py
        filename: connection.py
        module: connection
        exc_info: None
        exc_text: None
        stack_info: None
        lineno: 628
        funcName: call_blocking
        created: 1756165750.4657266
        msecs: 465.7266139984131
        relativeCreated: 5827.913761138916
        thread: 140609096431104
        threadName: MainThread
        processName: MainProcess
        process: 3129
      

      📌 Teardown phase

      duration:

      0.00012839213013648987
      

      outcome:

      passed
      

    Function: test_convert_dbus_strings

    • Test 134

      📌 Setup phase

      duration:

      0.0001337844878435135
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018472876399755478
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011023785918951035
      

      outcome:

      passed
      
  • 📄 test_utils_debug.py

    Function: test_traceable

    • Test 135
      params: cls="", entry=[[10, 20], {}], expected="creating: A(10, 20)"

      📌 Runtime Parameters

      params:
        cls: <class 'test_utils_debug.A'>
        entry:
          -       - 10
            - 20
          - (vide)
        expected: creating: A(10, 20)
      id: A-entry0-creating: A(10, 20)
      

      📌 Setup phase

      duration:

      0.0003309762105345726
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0010291021317243576
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018798187375068665
      

      outcome:

      passed
      
    • Test 136
      params: cls="", entry=[[10, 20], {"e": 100}], expected="creating: A(10, 20, e=100)"

      📌 Runtime Parameters

      params:
        cls: <class 'test_utils_debug.A'>
        entry:
          -       - 10
            - 20
          -       e: 100
        expected: creating: A(10, 20, e=100)
      id: A-entry1-creating: A(10, 20, e=100)
      

      📌 Setup phase

      duration:

      0.00030177831649780273
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0008240602910518646
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017070583999156952
      

      outcome:

      passed
      
    • Test 137
      params: cls="", entry="foo", [1, 2, 3, {"flag": true, "data": {"x": 9}}], expected="creating: A('foo', [1, 2, 3], flag=True, data={'x': 9})"

      📌 Runtime Parameters

      params:
        cls: <class 'test_utils_debug.A'>
        entry:
          -       - foo
            -         - 1
              - 2
              - 3
          -       flag: True
            data:
              x: 9
        expected: creating: A('foo', [1, 2, 3], flag=True, data={'x': 9})
      id: A-entry2-creating: A('foo', [1, 2, 3], flag=True, data={'x': 9})
      

      📌 Setup phase

      duration:

      0.0002841642126441002
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0010096291080117226
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.000193827785551548
      

      outcome:

      passed
      
    • Test 138
      params: cls="", entry="([CustomObj(big), [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], {'name': 'test', 'meta': 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'})", expected="creating: A(CustomObj(big), [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], name='test', meta='yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy...)"

      📌 Runtime Parameters

      params:
        cls: <class 'test_utils_debug.A'>
        entry: ([CustomObj(big), [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], {'name': 'test', 'meta': 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'})
        expected: creating: A(CustomObj(big), [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], name='test', meta='yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy...)
      id: A-entry3-creating: A(CustomObj(big), [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], name='test', meta='yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy...)
      

      📌 Setup phase

      duration:

      0.00028074439615011215
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0007867580279707909
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00030860304832458496
      

      outcome:

      passed
      
    • Test 139
      params: cls="", entry="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", [0, 0, 0, 0, 0, {}], expected="creating: A('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA..., [0, 0, 0, 0, 0])"

      📌 Runtime Parameters

      params:
        cls: <class 'test_utils_debug.A'>
        entry:
          -       - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
            -         - (vide)
              - (vide)
              - (vide)
              - (vide)
              - (vide)
          - (vide)
        expected: creating: A('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA..., [0, 0, 0, 0, 0])
      id: A-entry4-creating: A('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA..., [0, 0, 0, 0, 0])
      

      📌 Setup phase

      duration:

      0.0002948977053165436
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0008616000413894653
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001921849325299263
      

      outcome:

      passed
      

    Function: test_short_repr

    • Test 140
      params: value="abc", cutoff=10, expected="'abc'"

      📌 Runtime Parameters

      params:
        value: abc
        cutoff: 10
        expected: 'abc'
      id: abc-10-'abc'
      

      📌 Setup phase

      duration:

      0.0002806195989251137
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001648198813199997
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016180798411369324
      

      outcome:

      passed
      
    • Test 142
      params: value=12345, cutoff=10, expected="12345"

      📌 Runtime Parameters

      params:
        value: 12345
        cutoff: 10
        expected: 12345
      id: 12345-10-12345
      

      📌 Setup phase

      duration:

      0.0003449786454439163
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015875697135925293
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016824249178171158
      

      outcome:

      passed
      
    • Test 143
      params: value=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], cutoff=15, expected="[0, 0, 0, 0, 0,..."

      📌 Runtime Parameters

      params:
        value:
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
          - (vide)
        cutoff: 15
        expected: [0, 0, 0, 0, 0,...
      id: value3-15-[0, 0, 0, 0, 0,...
      

      📌 Setup phase

      duration:

      0.0002801632508635521
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016082357615232468
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015548709779977798
      

      outcome:

      passed
      
    • Test 144
      params: value=null, cutoff=10, expected="None"

      📌 Runtime Parameters

      params:
        value: None
        cutoff: 10
        expected: None
      id: None-10-None
      

      📌 Setup phase

      duration:

      0.00027105025947093964
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014162342995405197
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015264097601175308
      

      outcome:

      passed
      
  • 📄 test_utils_dictext.py

    Function: test_attrdict_getattr

    • Test 146
      params: data={"x": 1, "y": 2}, attr="x", expected=1

      📌 Runtime Parameters

      params:
        data:
          x: 1
          y: 2
        attr: x
        expected: 1
      id: data0-x-1
      

      📌 Setup phase

      duration:

      0.00030322372913360596
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001624859869480133
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015679560601711273
      

      outcome:

      passed
      
    • Test 147
      params: data={"world": "ok"}, attr="world", expected="ok"

      📌 Runtime Parameters

      params:
        data:
          world: ok
        attr: world
        expected: ok
      id: data1-world-ok
      

      📌 Setup phase

      duration:

      0.0002937428653240204
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014173053205013275
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001528458669781685
      

      outcome:

      passed
      
    • Test 148
      params: data={"outer": {"inner": 42}}, attr="outer", expected={"inner": 42}

      📌 Runtime Parameters

      params:
        data:
          outer:
            inner: 42
        attr: outer
        expected:
          inner: 42
      id: data2-outer-expected2
      

      📌 Setup phase

      duration:

      0.0002556759864091873
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013470277190208435
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001539662480354309
      

      outcome:

      passed
      

    Function: test_attrdict_setattr

    • Test 149
      params: initial={}, attr="nouveau", value=123

      📌 Runtime Parameters

      params:
        initial:
      {}
        attr: nouveau
        value: 123
      id: initial0-nouveau-123
      

      📌 Setup phase

      duration:

      0.0002639917656779289
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013954099267721176
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016499124467372894
      

      outcome:

      passed
      
    • Test 150
      params: initial={"a": 1}, attr="b", value="valeur"

      📌 Runtime Parameters

      params:
        initial:
          a: 1
        attr: b
        value: valeur
      id: initial1-b-valeur
      

      📌 Setup phase

      duration:

      0.00026898831129074097
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014041084796190262
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015461910516023636
      

      outcome:

      passed
      

    Function: test_attrdict_delattr

    • Test 151
      params: initial={"a": 1, "b": 2}, to_del="a", expected_keys=["b"]

      📌 Runtime Parameters

      params:
        initial:
          a: 1
          b: 2
        to_del: a
        expected_keys:
          - b
      id: initial0-a-expected_keys0
      

      📌 Setup phase

      duration:

      0.00025809090584516525
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00019228365272283554
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001537790521979332
      

      outcome:

      passed
      
    • Test 152
      params: initial={"k": "v"}, to_del="k", expected_keys=[]

      📌 Runtime Parameters

      params:
        initial:
          k: v
        to_del: k
        expected_keys:
      []
      id: initial1-k-expected_keys1
      

      📌 Setup phase

      duration:

      0.0002572406083345413
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00017330609261989594
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015296414494514465
      

      outcome:

      passed
      

    Function: test_attrdict_dir

    • Test 153
      params: data={"alpha": 1, "beta": 2}, expected_keys="{'beta', 'alpha'}"

      📌 Runtime Parameters

      params:
        data:
          alpha: 1
          beta: 2
        expected_keys: {'beta', 'alpha'}
      id: data0-expected_keys0
      

      📌 Setup phase

      duration:

      0.00022850092500448227
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013975892215967178
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013577938079833984
      

      outcome:

      passed
      
    • Test 154
      params: data={}, expected_keys="set()"

      📌 Runtime Parameters

      params:
        data:
      {}
        expected_keys: set()
      id: data1-expected_keys1
      

      📌 Setup phase

      duration:

      0.00023471470922231674
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016383547335863113
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013789348304271698
      

      outcome:

      passed
      

    Function: test_attrdict_getattr_and_missing

    • Test 155
      params: data={"x": 1, "y": 2}, attr="x", expect_value=1, expect_error=null

      📌 Runtime Parameters

      params:
        data:
          x: 1
          y: 2
        attr: x
        expect_value: 1
        expect_error: None
      id: data0-x-1-None
      

      📌 Setup phase

      duration:

      0.00031095370650291443
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014077965170145035
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001655295491218567
      

      outcome:

      passed
      
    • Test 156
      params: data={"number": 42}, attr="missing", expect_value=null, expect_error="'MyDict' object has no attribute 'missing'"

      📌 Runtime Parameters

      params:
        data:
          number: 42
        attr: missing
        expect_value: None
        expect_error: 'MyDict' object has no attribute 'missing'
      id: data1-missing-None-'MyDict' object has no attribute 'missing'
      

      📌 Setup phase

      duration:

      0.00030790455639362335
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016115698963403702
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001867460086941719
      

      outcome:

      passed
      

    Function: test_dictupdatemixin_init_and_update

    • Test 157
      params: init_kwargs={"a": 1, "b": 2}, other=null, kwargs={}, expected={"a": 1, "b": 2}

      📌 Runtime Parameters

      params:
        init_kwargs:
          a: 1
          b: 2
        other: None
        kwargs:
      {}
        expected:
          a: 1
          b: 2
      id: init_kwargs0-None-kwargs0-expected0
      

      📌 Setup phase

      duration:

      0.0003107422962784767
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015503820031881332
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016271322965621948
      

      outcome:

      passed
      
    • Test 158
      params: init_kwargs={}, other={"x": 10, "y": 20}, kwargs={}, expected={"x": 10, "y": 20}

      📌 Runtime Parameters

      params:
        init_kwargs:
      {}
        other:
          x: 10
          y: 20
        kwargs:
      {}
        expected:
          x: 10
          y: 20
      id: init_kwargs1-other1-kwargs1-expected1
      

      📌 Setup phase

      duration:

      0.0003075031563639641
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016245897859334946
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016658194363117218
      

      outcome:

      passed
      
    • Test 159
      params: init_kwargs={"world": "ok"}, other={"number": 42}, kwargs={"num2": 100}, expected={"world": "ok", "number": 42, "num2": 100}

      📌 Runtime Parameters

      params:
        init_kwargs:
          world: ok
        other:
          number: 42
        kwargs:
          num2: 100
        expected:
          world: ok
          number: 42
          num2: 100
      id: init_kwargs2-other2-kwargs2-expected2
      

      📌 Setup phase

      duration:

      0.0003063911572098732
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015133153647184372
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001652715727686882
      

      outcome:

      passed
      
    • Test 160
      params: init_kwargs={}, other=null, kwargs={"alpha": "beta"}, expected={"alpha": "beta"}

      📌 Runtime Parameters

      params:
        init_kwargs:
      {}
        other: None
        kwargs:
          alpha: beta
        expected:
          alpha: beta
      id: init_kwargs3-None-kwargs3-expected3
      

      📌 Setup phase

      duration:

      0.0002990439534187317
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013893470168113708
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001670410856604576
      

      outcome:

      passed
      
    • Test 161
      params: init_kwargs={}, other={"key": "value"}, kwargs={"extra": 1}, expected={"key": "value", "extra": 1}

      📌 Runtime Parameters

      params:
        init_kwargs:
      {}
        other:
          key: value
        kwargs:
          extra: 1
        expected:
          key: value
          extra: 1
      id: init_kwargs4-other4-kwargs4-expected4
      

      📌 Setup phase

      duration:

      0.0003025708720088005
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014360714703798294
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016340892761945724
      

      outcome:

      passed
      
    • Test 162
      params: init_kwargs={}, other="key", "value"], ["list", [5, 6], kwargs={"extra": {"subkey": 123}}, expected={"key": "value", "list": [5, 6], "extra": {"subkey": 123}}

      📌 Runtime Parameters

      params:
        init_kwargs:
      {}
        other:
          -       - key
            - value
          -       - list
            -         - 5
              - 6
        kwargs:
          extra:
            subkey: 123
        expected:
          key: value
          list:
            - 5
            - 6
          extra:
            subkey: 123
      id: init_kwargs5-other5-kwargs5-expected5
      

      📌 Setup phase

      duration:

      0.0002969931811094284
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000286654569208622
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017687678337097168
      

      outcome:

      passed
      
  • 📄 test_utils_dotdir.py

    Function: test_dotdir_creation_and_base_exists

    • Test 163

      📌 Setup phase

      duration:

      0.0012583332136273384
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00025301147252321243
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00021465681493282318
      

      outcome:

      passed
      

    Function: test_dotdir_repr_returns_path_str

    • Test 164

      📌 Setup phase

      duration:

      0.0006695147603750229
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00023066997528076172
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020739715546369553
      

      outcome:

      passed
      

    Function: test_dotdir_call

    • Test 165

      📌 Setup phase

      duration:

      0.0006398744881153107
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00040806829929351807
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.000216788612306118
      

      outcome:

      passed
      
  • 📄 test_utils_duo.py

    Function: TestPickledDictReal

    • Test 166

      📌 Setup phase

      duration:

      0.0001453924924135208
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.002697836607694626
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012242421507835388
      

      outcome:

      passed
      
    • Test 167

      📌 Setup phase

      duration:

      0.00011805631220340729
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0017392057925462723
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012164376676082611
      

      outcome:

      passed
      

    Function: TestSecrets

    • Test 168

      📌 Setup phase

      duration:

      0.0005609523504972458
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0018045492470264435
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0003607701510190964
      

      outcome:

      passed
      
    • Test 169

      📌 Setup phase

      duration:

      0.0005456786602735519
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0015707481652498245
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00034534838050603867
      

      outcome:

      passed
      
    • Test 170

      📌 Setup phase

      duration:

      0.0005818232893943787
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0014012642204761505
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00032724160701036453
      

      outcome:

      passed
      

    Function: test_get_pgroup_raises_if_no_key

    • Test 171

      📌 Setup phase

      duration:

      0.00019566621631383896
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00037664733827114105
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001345016062259674
      

      outcome:

      passed
      

    Function: test_get_pgroup_info_with_props_same_name_and_pi

    • Test 172

      📌 Setup phase

      duration:

      0.00018516834825277328
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001895138993859291
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014340784400701523
      

      outcome:

      passed
      

    Function: test_get_pgroup_info_with_props_different_pi

    • Test 173

      📌 Setup phase

      duration:

      0.000171000137925148
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001656385138630867
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001356750726699829
      

      outcome:

      passed
      

    Function: test_get_pgroup_info_without_props_with_owner

    • Test 174

      📌 Setup phase

      duration:

      0.0001730760559439659
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001693274825811386
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015648361295461655
      

      outcome:

      passed
      

    Function: test_get_pgroup_info_without_props_no_owner

    • Test 175

      📌 Setup phase

      duration:

      0.00016735494136810303
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016197841614484787
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014126673340797424
      

      outcome:

      passed
      

    Function: test_get_pgroup_info_mock

    • Test 176

      📌 Setup phase

      duration:

      0.0001708008348941803
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015815719962120056
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001360168680548668
      

      outcome:

      passed
      
  • 📄 test_utils_elog.py

    Function: test_get_default_elog_instance_with_wrong_password_and_real_check

    • Test 178

      📌 Setup phase

      duration:

      0.00014217570424079895
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.007346143946051598
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016361474990844727
      

      outcome:

      passed
      
  • 📄 test_utils_eval.py

    Function: test_arithmetic_eval_valid

    • Test 182
      params: expr="1 + 2", expected=3

      📌 Runtime Parameters

      params:
        expr: 1 + 2
        expected: 3
      id: 1 + 2-3
      

      📌 Setup phase

      duration:

      0.00032323505729436874
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00023476220667362213
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015345681458711624
      

      outcome:

      passed
      
    • Test 183
      params: expr="4 - 2", expected=2

      📌 Runtime Parameters

      params:
        expr: 4 - 2
        expected: 2
      id: 4 - 2-2
      

      📌 Setup phase

      duration:

      0.00022537074983119965
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00017390679568052292
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.000142768956720829
      

      outcome:

      passed
      
    • Test 184
      params: expr="3 * 5", expected=15

      📌 Runtime Parameters

      params:
        expr: 3 * 5
        expected: 15
      id: 3 * 5-15
      

      📌 Setup phase

      duration:

      0.00023394078016281128
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015318673104047775
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013664830476045609
      

      outcome:

      passed
      
    • Test 185
      params: expr="10 / 2", expected=5.0

      📌 Runtime Parameters

      params:
        expr: 10 / 2
        expected: 5.0
      id: 10 / 2-5.0
      

      📌 Setup phase

      duration:

      0.00023269746452569962
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015642214566469193
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001424560323357582
      

      outcome:

      passed
      
    • Test 186
      params: expr="10 % 3", expected=1

      📌 Runtime Parameters

      params:
        expr: 10 % 3
        expected: 1
      id: 10 % 3-1
      

      📌 Setup phase

      duration:

      0.00023172050714492798
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015511084347963333
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013589207082986832
      

      outcome:

      passed
      
    • Test 187
      params: expr="-5", expected=-5

      📌 Runtime Parameters

      params:
        expr: -5
        expected: -5
      id: -5--5
      

      📌 Setup phase

      duration:

      0.00023000501096248627
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001598978415131569
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013957731425762177
      

      outcome:

      passed
      
    • Test 188
      params: expr="+7", expected=7

      📌 Runtime Parameters

      params:
        expr: +7
        expected: 7
      id: +7-7
      

      📌 Setup phase

      duration:

      0.00021522026509046555
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014984514564275742
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014699436724185944
      

      outcome:

      passed
      
    • Test 189
      params: expr="1 + 2 * 3", expected=7

      📌 Runtime Parameters

      params:
        expr: 1 + 2 * 3
        expected: 7
      id: 1 + 2 * 3-7
      

      📌 Setup phase

      duration:

      0.0002222275361418724
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015996024012565613
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014033261686563492
      

      outcome:

      passed
      
    • Test 190
      params: expr="(1 + 2) * 3", expected=9

      📌 Runtime Parameters

      params:
        expr: (1 + 2) * 3
        expected: 9
      id: (1 + 2) * 3-9
      

      📌 Setup phase

      duration:

      0.00021122023463249207
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001612817868590355
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014464277774095535
      

      outcome:

      passed
      
    • Test 191
      params: expr="-(-3)", expected=3

      📌 Runtime Parameters

      params:
        expr: -(-3)
        expected: 3
      id: -(-3)-3
      

      📌 Setup phase

      duration:

      0.0002191700041294098
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001624561846256256
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013718940317630768
      

      outcome:

      passed
      
    • Test 192
      params: expr="-2 + 4 * 2", expected=6

      📌 Runtime Parameters

      params:
        expr: -2 + 4 * 2
        expected: 6
      id: -2 + 4 * 2-6
      

      📌 Setup phase

      duration:

      0.00022145919501781464
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00017492566257715225
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013896077871322632
      

      outcome:

      passed
      
    • Test 193
      params: expr="(4 + 5) * (6 - 1)", expected=45

      📌 Runtime Parameters

      params:
        expr: (4 + 5) * (6 - 1)
        expected: 45
      id: (4 + 5) * (6 - 1)-45
      

      📌 Setup phase

      duration:

      0.00021068472415208817
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016394630074501038
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014268327504396439
      

      outcome:

      passed
      
    • Test 194
      params: expr="(((3)))", expected=3

      📌 Runtime Parameters

      params:
        expr: (((3)))
        expected: 3
      id: (((3)))-3
      

      📌 Setup phase

      duration:

      0.00022993050515651703
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001523289829492569
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013672281056642532
      

      outcome:

      passed
      
    • Test 195
      params: expr="-(-(-2))", expected=-2

      📌 Runtime Parameters

      params:
        expr: -(-(-2))
        expected: -2
      id: -(-(-2))--2
      

      📌 Setup phase

      duration:

      0.0002331472933292389
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016134046018123627
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013719405978918076
      

      outcome:

      passed
      
    • Test 196
      params: expr="3 + +4", expected=7

      📌 Runtime Parameters

      params:
        expr: 3 + +4
        expected: 7
      id: 3 + +4-7
      

      📌 Setup phase

      duration:

      0.00022538471966981888
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015478301793336868
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014453846961259842
      

      outcome:

      passed
      
    • Test 197
      params: expr="3 + -4", expected=-1

      📌 Runtime Parameters

      params:
        expr: 3 + -4
        expected: -1
      id: 3 + -4--1
      

      📌 Setup phase

      duration:

      0.00022713840007781982
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001535378396511078
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013621803373098373
      

      outcome:

      passed
      
    • Test 198
      params: expr="True + 1", expected=2

      📌 Runtime Parameters

      params:
        expr: True + 1
        expected: 2
      id: True + 1-2
      

      📌 Setup phase

      duration:

      0.00021699443459510803
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000158810056746006
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013799592852592468
      

      outcome:

      passed
      
    • Test 199
      params: expr="'string'", expected="string"

      📌 Runtime Parameters

      params:
        expr: 'string'
        expected: string
      id: 'string'-string
      

      📌 Setup phase

      duration:

      0.00021047331392765045
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014292355626821518
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014348141849040985
      

      outcome:

      passed
      
    • Test 200
      params: expr="1e1000 * 1e1000", expected=Infinity

      📌 Runtime Parameters

      params:
        expr: 1e1000 * 1e1000
        expected: inf
      id: 1e1000 * 1e1000-inf
      

      📌 Setup phase

      duration:

      0.00022228527814149857
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015551410615444183
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015028472989797592
      

      outcome:

      passed
      
    • Test 201
      params: expr="'a' + 'b'", expected="ab"

      📌 Runtime Parameters

      params:
        expr: 'a' + 'b'
        expected: ab
      id: 'a' + 'b'-ab
      

      📌 Setup phase

      duration:

      0.00020917784422636032
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001525217667222023
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014072097837924957
      

      outcome:

      passed
      

    Function: test_arithmetic_eval_raises_with_message

    • Test 202
      params: expr="2 ** 3", expected_message="Unsupported BinOp Pow"

      📌 Runtime Parameters

      params:
        expr: 2 ** 3
        expected_message: Unsupported BinOp Pow
      id: 2 ** 3-Unsupported BinOp Pow
      

      📌 Setup phase

      duration:

      0.00021586008369922638
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0004124818369746208
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015159230679273605
      

      outcome:

      passed
      
    • Test 203
      params: expr="3 << 1", expected_message="Unsupported BinOp LShift"

      📌 Runtime Parameters

      params:
        expr: 3 << 1
        expected_message: Unsupported BinOp LShift
      id: 3 << 1-Unsupported BinOp LShift
      

      📌 Setup phase

      duration:

      0.00023405812680721283
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00036750268191099167
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001498628407716751
      

      outcome:

      passed
      
    • Test 204
      params: expr="1 < 2", expected_message="Unsupported node type Compare"

      📌 Runtime Parameters

      params:
        expr: 1 < 2
        expected_message: Unsupported node type Compare
      id: 1 < 2-Unsupported node type Compare
      

      📌 Setup phase

      duration:

      0.00022483058273792267
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00036623235791921616
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015805009752511978
      

      outcome:

      passed
      
    • Test 205
      params: expr="abs(3)", expected_message="Unsupported node type Call"

      📌 Runtime Parameters

      params:
        expr: abs(3)
        expected_message: Unsupported node type Call
      id: abs(3)-Unsupported node type Call
      

      📌 Setup phase

      duration:

      0.0002229614183306694
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00036109425127506256
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016665272414684296
      

      outcome:

      passed
      
    • Test 206
      params: expr="a + 2", expected_message="Unsupported node type Name"

      📌 Runtime Parameters

      params:
        expr: a + 2
        expected_message: Unsupported node type Name
      id: a + 2-Unsupported node type Name
      

      📌 Setup phase

      duration:

      0.000244995579123497
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003508152440190315
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014153867959976196
      

      outcome:

      passed
      
    • Test 207
      params: expr="string", expected_message="Unsupported node type Name"

      📌 Runtime Parameters

      params:
        expr: string
        expected_message: Unsupported node type Name
      id: string-Unsupported node type Name
      

      📌 Setup phase

      duration:

      0.00022779963910579681
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018384400755167007
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015034154057502747
      

      outcome:

      passed
      
    • Test 208
      params: expr="[1, 2] + [3]", expected_message="Unsupported node type List"

      📌 Runtime Parameters

      params:
        expr: [1, 2] + [3]
        expected_message: Unsupported node type List
      id: [1, 2] + [3]-Unsupported node type List
      

      📌 Setup phase

      duration:

      0.00021199975162744522
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005474351346492767
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016020890325307846
      

      outcome:

      passed
      
    • Test 209
      params: expr="{1: 2}", expected_message="Unsupported node type Dict"

      📌 Runtime Parameters

      params:
        expr: {1: 2}
        expected_message: Unsupported node type Dict
      id: {1: 2}-Unsupported node type Dict
      

      📌 Setup phase

      duration:

      0.00024091824889183044
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003350144252181053
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014165323227643967
      

      outcome:

      passed
      

    Function: test_arithmetic_eval_runtime_errors

    • Test 210
      params: expr="1 / 0", exception=""

      📌 Runtime Parameters

      params:
        expr: 1 / 0
        exception: <class 'ZeroDivisionError'>
      id: 1 / 0-ZeroDivisionError
      

      📌 Setup phase

      duration:

      0.00023054424673318863
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018588174134492874
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015467777848243713
      

      outcome:

      passed
      
    • Test 211
      params: expr="10 % 0", exception=""

      📌 Runtime Parameters

      params:
        expr: 10 % 0
        exception: <class 'ZeroDivisionError'>
      id: 10 % 0-ZeroDivisionError
      

      📌 Setup phase

      duration:

      0.0002141939476132393
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00017964374274015427
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014972221106290817
      

      outcome:

      passed
      

    Function: test_forgiving_eval

    • Test 212
      params: expr="1 + 2", expected=3

      📌 Runtime Parameters

      params:
        expr: 1 + 2
        expected: 3
      id: 1 + 2-3
      

      📌 Setup phase

      duration:

      0.00022046267986297607
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015280209481716156
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001531047746539116
      

      outcome:

      passed
      
    • Test 213
      params: expr="bad + 2", expected="bad + 2"

      📌 Runtime Parameters

      params:
        expr: bad + 2
        expected: bad + 2
      id: bad + 2-bad + 2
      

      📌 Setup phase

      duration:

      0.00022395793348550797
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00017455872148275375
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013555586338043213
      

      outcome:

      passed
      
    • Test 214
      params: expr="1 / 0", expected="1 / 0"

      📌 Runtime Parameters

      params:
        expr: 1 / 0
        expected: 1 / 0
      id: 1 / 0-1 / 0
      

      📌 Setup phase

      duration:

      0.00021650921553373337
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001658918336033821
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013644807040691376
      

      outcome:

      passed
      
    • Test 215
      params: expr="2 ** 10", expected="2 ** 10"

      📌 Runtime Parameters

      params:
        expr: 2 ** 10
        expected: 2 ** 10
      id: 2 ** 10-2 ** 10
      

      📌 Setup phase

      duration:

      0.0002113794907927513
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001556631177663803
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001390436664223671
      

      outcome:

      passed
      

    Function: test_defaulting_eval

    • Test 216
      params: expr="3 * 4", default=0, expected=12

      📌 Runtime Parameters

      params:
        expr: 3 * 4
        default: 0
        expected: 12
      id: 3 * 4-0-12
      

      📌 Setup phase

      duration:

      0.0002729501575231552
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015443377196788788
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014824699610471725
      

      outcome:

      passed
      
    • Test 217
      params: expr="invalid + 1", default=99, expected=99

      📌 Runtime Parameters

      params:
        expr: invalid + 1
        default: 99
        expected: 99
      id: invalid + 1-99-99
      

      📌 Setup phase

      duration:

      0.00027586985379457474
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016186758875846863
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015433784574270248
      

      outcome:

      passed
      
    • Test 218
      params: expr="1 / 0", default=-1, expected=-1

      📌 Runtime Parameters

      params:
        expr: 1 / 0
        default: -1
        expected: -1
      id: 1 / 0--1--1
      

      📌 Setup phase

      duration:

      0.00025918148458004
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001543266698718071
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016544479876756668
      

      outcome:

      passed
      
    • Test 219
      params: expr="2 ** 10", default=42, expected=42

      📌 Runtime Parameters

      params:
        expr: 2 ** 10
        default: 42
        expected: 42
      id: 2 ** 10-42-42
      

      📌 Setup phase

      duration:

      0.0002631368115544319
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001572147011756897
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016109924763441086
      

      outcome:

      passed
      
  • 📄 test_utils_exceptions.py

    Function: test_chained_exception_various

    • Test 220
      params: func="", expected_output="High-level task failed\ncaused by KeyError: 'missing'"

      📌 Runtime Parameters

      params:
        func: <function cause_key_error at 0x7fe1c5fa1700>
        expected_output: High-level task failed
      caused by KeyError: 'missing'
      id: cause_key_error-High-level task failed\ncaused by KeyError: 'missing'
      

      📌 Setup phase

      duration:

      0.00024044234305620193
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001744106411933899
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014337990432977676
      

      outcome:

      passed
      
    • Test 221
      params: func="", expected_output="High-level task failed\ncaused by IndexError: list index out of range"

      📌 Runtime Parameters

      params:
        func: <function cause_index_error at 0x7fe1c5fa1820>
        expected_output: High-level task failed
      caused by IndexError: list index out of range
      id: cause_index_error-High-level task failed\ncaused by IndexError: list index out of range
      

      📌 Setup phase

      duration:

      0.00021317601203918457
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001500425860285759
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014659296721220016
      

      outcome:

      passed
      
    • Test 222
      params: func="", expected_output="High-level task failed\ncaused by ZeroDivisionError: division by zero"

      📌 Runtime Parameters

      params:
        func: <function cause_zero_division at 0x7fe1c5fa18b0>
        expected_output: High-level task failed
      caused by ZeroDivisionError: division by zero
      id: cause_zero_division-High-level task failed\ncaused by ZeroDivisionError: division by zero
      

      📌 Setup phase

      duration:

      0.00023139920085668564
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001471061259508133
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001352168619632721
      

      outcome:

      passed
      
    • Test 223
      params: func="", expected_output="High-level task failed\ncaused by ValueError: invalid literal for int() with base 10: 'not_a_number'"

      📌 Runtime Parameters

      params:
        func: <function cause_value_error at 0x7fe1c5fa1940>
        expected_output: High-level task failed
      caused by ValueError: invalid literal for int() with base 10: 'not_a_number'
      id: cause_value_error-High-level task failed\ncaused by ValueError: invalid literal for int() with base 10: 'not_a_number'
      

      📌 Setup phase

      duration:

      0.0002259034663438797
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015168450772762299
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013868603855371475
      

      outcome:

      passed
      
    • Test 224
      params: func="", expected_output="High-level task failed\ncaused by TypeError: can only concatenate str (not \"int\") to str"

      📌 Runtime Parameters

      params:
        func: <function cause_type_error at 0x7fe1c5fa19d0>
        expected_output: High-level task failed
      caused by TypeError: can only concatenate str (not "int") to str
      id: cause_type_error-High-level task failed\ncaused by TypeError: can only concatenate str (not "int") to str
      

      📌 Setup phase

      duration:

      0.00022467970848083496
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001413598656654358
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013378355652093887
      

      outcome:

      passed
      

    Function: test_printed_exception

    • Test 225
      params: func="", expected_output="KeyError: 'missing'"

      📌 Runtime Parameters

      params:
        func: <function cause_key_error at 0x7fe1c5fa1700>
        expected_output: KeyError: 'missing'
      id: cause_key_error-KeyError: 'missing'
      

      📌 Setup phase

      duration:

      0.0007421281188726425
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0010596290230751038
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.000473816879093647
      

      outcome:

      passed
      
    • Test 226
      params: func="", expected_output="IndexError: list index out of range"

      📌 Runtime Parameters

      params:
        func: <function cause_index_error at 0x7fe1c5fa1820>
        expected_output: IndexError: list index out of range
      id: cause_index_error-IndexError: list index out of range
      

      📌 Setup phase

      duration:

      0.0005696834996342659
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0009098658338189125
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0004436541348695755
      

      outcome:

      passed
      
    • Test 227
      params: func="", expected_output="ZeroDivisionError: division by zero"

      📌 Runtime Parameters

      params:
        func: <function cause_zero_division at 0x7fe1c5fa18b0>
        expected_output: ZeroDivisionError: division by zero
      id: cause_zero_division-ZeroDivisionError: division by zero
      

      📌 Setup phase

      duration:

      0.000603814609348774
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00099989864975214
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0004786830395460129
      

      outcome:

      passed
      
    • Test 228
      params: func="", expected_output="ValueError: invalid literal for int() with base 10: 'not_a_number'"

      📌 Runtime Parameters

      params:
        func: <function cause_value_error at 0x7fe1c5fa1940>
        expected_output: ValueError: invalid literal for int() with base 10: 'not_a_number'
      id: cause_value_error-ValueError: invalid literal for int() with base 10: 'not_a_number'
      

      📌 Setup phase

      duration:

      0.0006190221756696701
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0008933320641517639
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0004372214898467064
      

      outcome:

      passed
      
    • Test 229
      params: func="", expected_output="TypeError: can only concatenate str (not \"int\") to str"

      📌 Runtime Parameters

      params:
        func: <function cause_type_error at 0x7fe1c5fa19d0>
        expected_output: TypeError: can only concatenate str (not "int") to str
      id: cause_type_error-TypeError: can only concatenate str (not "int") to str
      

      📌 Setup phase

      duration:

      0.0005722464993596077
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0009755324572324753
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00046170037239789963
      

      outcome:

      passed
      
  • 📄 test_utils_get_adj.py

    Function: test_get_adj_success

    • Test 230

      📌 Setup phase

      duration:

      0.00016299355775117874
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006605088710784912
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012225192040205002
      

      outcome:

      passed
      

    Function: test_get_adj_not_found

    • Test 231

      📌 Setup phase

      duration:

      0.0006134957075119019
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0009715333580970764
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00044058170169591904
      

      outcome:

      passed
      

    Function: test_ensure_adjs_mixed

    • Test 232

      📌 Setup phase

      duration:

      0.0001225396990776062
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0007632961496710777
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011136382818222046
      

      outcome:

      passed
      
  • 📄 test_utils_hastepics.py

    Function: test_motor_invalid_name_raises

    • Test 236

      📌 Setup phase

      duration:

      0.00016320683062076569
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00029869936406612396
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014410819858312607
      

      outcome:

      passed
      

    Function: test_motor_init_list_and_extras_build_handles_eagerly

    • Test 238

      📌 Setup phase

      duration:

      0.00016578380018472672
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.001418301835656166
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012781936675310135
      

      outcome:

      passed
      

    Function: test_speedup_get_pv

    • Test 240

      📌 Setup phase

      duration:

      0.00016411207616329193
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      5.000532819889486
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002012467011809349
      

      outcome:

      passed
      

    Function: test_motor_init_list_attrs_created

    • Test 243

      📌 Setup phase

      duration:

      0.0001553501933813095
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0010719066485762596
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014263391494750977
      

      outcome:

      passed
      

    Function: test_motor_extras_attrs_correct

    • Test 244

      📌 Setup phase

      duration:

      0.0001422083005309105
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0009756796061992645
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011978764086961746
      

      outcome:

      passed
      

    Function: test_motor_callbacks_empty

    • Test 245

      📌 Setup phase

      duration:

      0.00013219378888607025
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0011296141892671585
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013697706162929535
      

      outcome:

      passed
      
  • 📄 test_utils_ipy.py

    Function: test_devices_repr_fallback_and_ignore

    • Test 246

      📌 Setup phase

      duration:

      0.0007273582741618156
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0008411668241024017
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002596471458673477
      

      outcome:

      passed
      
  • 📄 test_utils_jsonext.py

    Function: test_json_validate_save_load

    • Test 247
      params: input_obj="[1 2 3]", expected=[1, 2, 3]

      📌 Runtime Parameters

      params:
        input_obj: [1 2 3]
        expected:
          - 1
          - 2
          - 3
      id: input_obj0-expected0
      

      📌 Setup phase

      duration:

      0.0009490856900811195
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006567137315869331
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002091461792588234
      

      outcome:

      passed
      
    • Test 248
      params: input_obj="42", expected=42

      📌 Runtime Parameters

      params:
        input_obj: 42
        expected: 42
      id: input_obj1-42
      

      📌 Setup phase

      duration:

      0.0006636930629611015
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00041273515671491623
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0009262049570679665
      

      outcome:

      passed
      
    • Test 249
      params: input_obj="(1-1j)", expected={"real": 1.0, "imag": -1.0}

      📌 Runtime Parameters

      params:
        input_obj: (1-1j)
        expected:
          real: 1.0
          imag: -1.0
      id: (1-1j)-expected2
      

      📌 Setup phase

      duration:

      0.0006166435778141022
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0004616370424628258
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001768544316291809
      

      outcome:

      passed
      
    • Test 250
      params: input_obj="/tmp/file.txt", expected="/tmp/file.txt"

      📌 Runtime Parameters

      params:
        input_obj: /tmp/file.txt
        expected: /tmp/file.txt
      id: input_obj3-/tmp/file.txt
      

      📌 Setup phase

      duration:

      0.000638800673186779
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00039715971797704697
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018242839723825455
      

      outcome:

      passed
      
    • Test 251
      params: input_obj="{1, 2, 3}", expected=[1, 2, 3]

      📌 Runtime Parameters

      params:
        input_obj: {1, 2, 3}
        expected:
          - 1
          - 2
          - 3
      id: input_obj4-expected4
      

      📌 Setup phase

      duration:

      0.0006395140662789345
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00039420463144779205
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018680840730667114
      

      outcome:

      passed
      
    • Test 252
      params: input_obj="{'a': array([10, 20])}", expected={"a": [10, 20]}

      📌 Runtime Parameters

      params:
        input_obj: {'a': array([10, 20])}
        expected:
          a:
            - 10
            - 20
      id: input_obj5-expected5
      

      📌 Setup phase

      duration:

      0.0006305733695626259
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00040382612496614456
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019163638353347778
      

      outcome:

      passed
      
    • Test 253
      params: input_obj="{'c': (2+3j)}", expected={"c": {"real": 2.0, "imag": 3.0}}

      📌 Runtime Parameters

      params:
        input_obj: {'c': (2+3j)}
        expected:
          c:
            real: 2.0
            imag: 3.0
      id: input_obj6-expected6
      

      📌 Setup phase

      duration:

      0.0006264727562665939
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00041236355900764465
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018106680363416672
      

      outcome:

      passed
      
    • Test 254
      params: input_obj="{'nested': {'arr': array(10, 20],\n [30, 40), 'complex_num': (-1+5j), 'files': [PosixPath('/file1'), PosixPath('/file2')], 'set_values': {200, 100}, 'inner': {'num': 7}}}", expected={"nested": {"arr": 10, 20], [30, 40, "complex_num": {"real": -1.0, "imag": 5.0}, "files": ["/file1", "/file2"], "set_values": [100, 200], "inner": {"num": 7}}}

      📌 Runtime Parameters

      params:
        input_obj: {'nested': {'arr': array([[10, 20],
             [30, 40]]), 'complex_num': (-1+5j), 'files': [PosixPath('/file1'), PosixPath('/file2')], 'set_values': {200, 100}, 'inner': {'num': 7}}}
        expected:
          nested:
            arr:
              -           - 10
                - 20
              -           - 30
                - 40
            complex_num:
              real: -1.0
              imag: 5.0
            files:
              - /file1
              - /file2
            set_values:
              - 100
              - 200
            inner:
              num: 7
      id: input_obj7-expected7
      

      📌 Setup phase

      duration:

      0.0005886880680918694
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006352905184030533
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00023796502500772476
      

      outcome:

      passed
      
  • 📄 test_utils_lazypv.py

    Function: test_getattr

    • Test 255

      📌 Setup phase

      duration:

      0.00014125555753707886
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002885498106479645
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011279433965682983
      

      outcome:

      passed
      
  • 📄 test_utils_logcfg.py

    Function: test_custom_log_outputs

    • Test 256
      params: levelname="LONG", logfunc=" at 0x7fe1c5dc4ee0>", message="This is a LONG message"

      📌 Runtime Parameters

      params:
        levelname: LONG
        logfunc: <function <lambda> at 0x7fe1c5dc4ee0>
        message: This is a LONG message
      id: LONG-<lambda>-This is a LONG message
      

      📌 Setup phase

      duration:

      0.001545734703540802
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0007668985053896904
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00024434085935354233
      

      outcome:

      passed
      
    • Test 257
      params: levelname="ENLARGE", logfunc=" at 0x7fe1c5dc4f70>", message="Please ENLARGE this!"

      📌 Runtime Parameters

      params:
        levelname: ENLARGE
        logfunc: <function <lambda> at 0x7fe1c5dc4f70>
        message: Please ENLARGE this!
      id: ENLARGE-<lambda>-Please ENLARGE this!
      

      📌 Setup phase

      duration:

      0.00045033544301986694
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0004047974944114685
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00023054704070091248
      

      outcome:

      passed
      
  • 📄 test_utils_logign.py

    Function: test_ignore_log_msg_behavior

    • Test 259
      params: levelname="WARNING", msg_to_ignore="This should be ignored", msg_to_keep="This should appear"

      📌 Runtime Parameters

      params:
        levelname: WARNING
        msg_to_ignore: This should be ignored
        msg_to_keep: This should appear
      id: WARNING-This should be ignored-This should appear
      

      📌 Setup phase

      duration:

      0.0006208661943674088
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0008352631703019142
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00025250762701034546
      

      outcome:

      passed
      
    • Test 260
      params: levelname="ENLARGE", msg_to_ignore="ENLARGE this", msg_to_keep="Keep this ENLARGE"

      📌 Runtime Parameters

      params:
        levelname: ENLARGE
        msg_to_ignore: ENLARGE this
        msg_to_keep: Keep this ENLARGE
      id: ENLARGE-ENLARGE this-Keep this ENLARGE
      

      📌 Setup phase

      duration:

      0.00041464436799287796
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005106208845973015
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00022057350724935532
      

      outcome:

      passed
      

    Function: test_ignore_only_by_level

    • Test 261

      📌 Setup phase

      duration:

      0.00025094207376241684
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00044045690447092056
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018183328211307526
      

      outcome:

      passed
      

    Function: test_ignore_only_by_msg

    • Test 262

      📌 Setup phase

      duration:

      0.00024380534887313843
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003866627812385559
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017730426043272018
      

      outcome:

      passed
      

    Function: test_filter_removed_after_context

    • Test 263

      📌 Setup phase

      duration:

      0.00027333758771419525
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003989236429333687
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017881300300359726
      

      outcome:

      passed
      
  • 📄 test_utils_marker.py

    Function: test_format_value_with_units

    • Test 264

      📌 Setup phase

      duration:

      0.00012365635484457016
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002294052392244339
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010962039232254028
      

      outcome:

      passed
      

    Function: test_format_value_without_units

    • Test 265

      📌 Setup phase

      duration:

      0.00011348351836204529
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016255490481853485
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001064864918589592
      

      outcome:

      passed
      

    Function: test_marker_name_default

    • Test 266

      📌 Setup phase

      duration:

      0.0001140916720032692
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002382863312959671
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001064743846654892
      

      outcome:

      passed
      

    Function: test_marker_name_custom

    • Test 267

      📌 Setup phase

      duration:

      0.00011292006820440292
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018357578665018082
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011113099753856659
      

      outcome:

      passed
      

    Function: test_marker_repr_format

    • Test 268

      📌 Setup phase

      duration:

      0.0001167450100183487
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018046516925096512
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010031647980213165
      

      outcome:

      passed
      

    Function: test_marker_update_changes_value

    • Test 269

      📌 Setup phase

      duration:

      0.00011184625327587128
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014860834926366806
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011607632040977478
      

      outcome:

      passed
      

    Function: test_marker_update_with_explicit_value

    • Test 270

      📌 Setup phase

      duration:

      0.000109880231320858
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001841532066464424
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001063542440533638
      

      outcome:

      passed
      

    Function: test_marker_goto_sets_value_and_returns_result

    • Test 271

      📌 Setup phase

      duration:

      0.0001130569726228714
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001852773129940033
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.961798787117004e-05
      

      outcome:

      passed
      

    Function: test_marker_call_is_alias_of_goto

    • Test 272

      📌 Setup phase

      duration:

      0.00010657496750354767
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016538985073566437
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011532101780176163
      

      outcome:

      passed
      

    Function: test_markers_register_and_access

    • Test 273

      📌 Setup phase

      duration:

      0.00010405853390693665
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00032759830355644226
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012039113789796829
      

      outcome:

      passed
      

    Function: test_markers_repr_contains_all

    • Test 274

      📌 Setup phase

      duration:

      0.00011700950562953949
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00029665883630514145
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010782573372125626
      

      outcome:

      passed
      

    Function: test_marker_registry_dict_is_printable_dict

    • Test 275

      📌 Setup phase

      duration:

      0.00012802612036466599
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00020594894886016846
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010035932064056396
      

      outcome:

      passed
      

    Function: test_markers_getitem_invalid_key_raises

    • Test 276

      📌 Setup phase

      duration:

      0.00010729487985372543
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002064025029540062
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011093635112047195
      

      outcome:

      passed
      
  • 📄 test_utils_metaclasses.py

    Function: test_combine_classes_combines_methods

    • Test 277

      📌 Setup phase

      duration:

      0.00015209056437015533
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00019262637943029404
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011210981756448746
      

      outcome:

      passed
      

    Function: test_registryabc_combines_registrymeta_and_abcmeta

    • Test 278

      📌 Setup phase

      duration:

      0.0001139231026172638
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.005194994620978832
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013940315693616867
      

      outcome:

      passed
      
  • 📄 test_utils_namespace.py

    Function: test_namespace_pretty_repr_mixed_and_nested

    • Test 279

      📌 Setup phase

      duration:

      0.0001407889649271965
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000270267017185688
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013149436563253403
      

      outcome:

      passed
      
  • 📄 test_utils_npy.py

    Function: test_nice_arange

    • Test 280
      params: start=0, stop=5, step=1, expected=[0, 1, 2, 3, 4, 5]

      📌 Runtime Parameters

      params:
        start: 0
        stop: 5
        step: 1
        expected:
          - (vide)
          - 1
          - 2
          - 3
          - 4
          - 5
      id: 0-5-1-expected0
      

      📌 Setup phase

      duration:

      0.00041313935071229935
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.02047424204647541
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0003333995118737221
      

      outcome:

      passed
      
    • Test 281
      params: start=5, stop=0, step=-1, expected=[0, 1, 2, 3, 4, 5]

      📌 Runtime Parameters

      params:
        start: 5
        stop: 0
        step: -1
        expected:
          - (vide)
          - 1
          - 2
          - 3
          - 4
          - 5
      id: 5-0--1-expected1
      

      📌 Setup phase

      duration:

      0.0004331124946475029
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00043182820081710815
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020662043243646622
      

      outcome:

      passed
      
    • Test 282
      params: start=1, stop=2, step=0.3, expected=[1, 1.3333333333333333, 1.6666666666666667, 2]

      📌 Runtime Parameters

      params:
        start: 1
        stop: 2
        step: 0.3
        expected:
          - 1
          - 1.3333333333333333
          - 1.6666666666666667
          - 2
      id: 1-2-0.3-expected2
      

      📌 Setup phase

      duration:

      0.0003715232014656067
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003778589889407158
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019297748804092407
      

      outcome:

      passed
      
    • Test 283
      params: start=-2, stop=2, step=1.5, expected=[-2, -0.6666666666666666, 0.6666666666666666, 2]

      📌 Runtime Parameters

      params:
        start: -2
        stop: 2
        step: 1.5
        expected:
          - -2
          - -0.6666666666666666
          - 0.6666666666666666
          - 2
      id: -2-2-1.5-expected3
      

      📌 Setup phase

      duration:

      0.0003539910539984703
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00036371685564517975
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001977812498807907
      

      outcome:

      passed
      
    • Test 284
      params: start=2.5, stop=0.5, step=-0.4, expected=[0.5, 0.9, 1.3, 1.7, 2.1, 2.5]

      📌 Runtime Parameters

      params:
        start: 2.5
        stop: 0.5
        step: -0.4
        expected:
          - 0.5
          - 0.9
          - 1.3
          - 1.7
          - 2.1
          - 2.5
      id: 2.5-0.5--0.4-expected4
      

      📌 Setup phase

      duration:

      0.0003692666068673134
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003493940457701683
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001861434429883957
      

      outcome:

      passed
      

    Function: test_nice_linspace

    • Test 285
      params: start=0, stop=10, num=4, expected="[ 0. 2.5 5. 7.5 10. ]"

      📌 Runtime Parameters

      params:
        start: 0
        stop: 10
        num: 4
        expected: [ 0.   2.5  5.   7.5 10. ]
      id: 0-10-4-expected0
      

      📌 Setup phase

      duration:

      0.00037308596074581146
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003842012956738472
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00022612512111663818
      

      outcome:

      passed
      
    • Test 286
      params: start=5, stop=15, num=2, expected="[ 5. 10. 15.]"

      📌 Runtime Parameters

      params:
        start: 5
        stop: 15
        num: 2
        expected: [ 5. 10. 15.]
      id: 5-15-2-expected1
      

      📌 Setup phase

      duration:

      0.00037161074578762054
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00040396489202976227
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002745436504483223
      

      outcome:

      passed
      
    • Test 287
      params: start=-5, stop=5, num=4, expected="[-5. -2.5 0. 2.5 5. ]"

      📌 Runtime Parameters

      params:
        start: -5
        stop: 5
        num: 4
        expected: [-5.  -2.5  0.   2.5  5. ]
      id: -5-5-4-expected2
      

      📌 Setup phase

      duration:

      0.0003636777400970459
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003883093595504761
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020189210772514343
      

      outcome:

      passed
      
    • Test 288
      params: start=0, stop=1, num=3, expected="[0. 0.33333333 0.66666667 1. ]"

      📌 Runtime Parameters

      params:
        start: 0
        stop: 1
        num: 3
        expected: [0.         0.33333333 0.66666667 1.        ]
      id: 0-1-3-expected3
      

      📌 Setup phase

      duration:

      0.00035286135971546173
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00035759154707193375
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019963737577199936
      

      outcome:

      passed
      
    • Test 289
      params: start=2, stop=2, num=3, expected="[2. 2. 2. 2.]"

      📌 Runtime Parameters

      params:
        start: 2
        stop: 2
        num: 3
        expected: [2. 2. 2. 2.]
      id: 2-2-3-expected4
      

      📌 Setup phase

      duration:

      0.0003697080537676811
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00034490786492824554
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020092353224754333
      

      outcome:

      passed
      
    • Test 290
      params: start=3, stop=0, num=3, expected="[3. 2. 1. 0.]"

      📌 Runtime Parameters

      params:
        start: 3
        stop: 0
        num: 3
        expected: [3. 2. 1. 0.]
      id: 3-0-3-expected5
      

      📌 Setup phase

      duration:

      0.00035592634230852127
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003404589369893074
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019240286201238632
      

      outcome:

      passed
      
    • Test 291
      params: start=0, stop=1, num=0, expected="[0.]"

      📌 Runtime Parameters

      params:
        start: 0
        stop: 1
        num: 0
        expected: [0.]
      id: 0-1-0-expected6
      

      📌 Setup phase

      duration:

      0.0003365706652402878
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00035339687019586563
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019606761634349823
      

      outcome:

      passed
      
    • Test 292
      params: start=-2, stop=2, num=3, expected="[-2. -0.66666667 0.66666667 2. ]"

      📌 Runtime Parameters

      params:
        start: -2
        stop: 2
        num: 3
        expected: [-2.         -0.66666667  0.66666667  2.        ]
      id: -2-2-3-expected7
      

      📌 Setup phase

      duration:

      0.0003585405647754669
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003437874838709831
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00022002402693033218
      

      outcome:

      passed
      

    Function: test_nice_steps_centered

    • Test 293
      params: start=-2, stop=2, step=2, endpoint=true, expected="[-2. 0. 2.]"

      📌 Runtime Parameters

      params:
        start: -2
        stop: 2
        step: 2
        endpoint: True
        expected: [-2.  0.  2.]
      id: -2-2-2-True-expected0
      

      📌 Setup phase

      duration:

      0.0004054997116327286
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00038890354335308075
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002201506868004799
      

      outcome:

      passed
      
    • Test 294
      params: start=0, stop=5, step=2, endpoint=true, expected="[0. 2. 4.]"

      📌 Runtime Parameters

      params:
        start: 0
        stop: 5
        step: 2
        endpoint: True
        expected: [0. 2. 4.]
      id: 0-5-2-True-expected1
      

      📌 Setup phase

      duration:

      0.0003927769139409065
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003780890256166458
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00021859724074602127
      

      outcome:

      passed
      
    • Test 295
      params: start=0, stop=5, step=2, endpoint=false, expected="[0. 2.]"

      📌 Runtime Parameters

      params:
        start: 0
        stop: 5
        step: 2
        endpoint: False
        expected: [0. 2.]
      id: 0-5-2-False-expected2
      

      📌 Setup phase

      duration:

      0.00044681038707494736
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00038805510848760605
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00022755376994609833
      

      outcome:

      passed
      
    • Test 296
      params: start=-1, stop=2, step=1.5, endpoint=true, expected="[-1.5 0. 1.5]"

      📌 Runtime Parameters

      params:
        start: -1
        stop: 2
        step: 1.5
        endpoint: True
        expected: [-1.5  0.   1.5]
      id: -1-2-1.5-True-expected3
      

      📌 Setup phase

      duration:

      0.00038968678563833237
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00038286298513412476
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002475446090102196
      

      outcome:

      passed
      
    • Test 297
      params: start=-1, stop=2, step=-1.5, endpoint=true, expected="[ 1.5 0. -1.5]"

      📌 Runtime Parameters

      params:
        start: -1
        stop: 2
        step: -1.5
        endpoint: True
        expected: [ 1.5  0.  -1.5]
      id: -1-2--1.5-True-expected4
      

      📌 Setup phase

      duration:

      0.0004331916570663452
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00035188905894756317
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002037128433585167
      

      outcome:

      passed
      
    • Test 298
      params: start=5, stop=0, step=-2, endpoint=true, expected="[0. 2. 4.]"

      📌 Runtime Parameters

      params:
        start: 5
        stop: 0
        step: -2
        endpoint: True
        expected: [0. 2. 4.]
      id: 5-0--2-True-expected5
      

      📌 Setup phase

      duration:

      0.00039356015622615814
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00037438515573740005
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020761415362358093
      

      outcome:

      passed
      

    Function: test_nice_steps_left_aligned

    • Test 299
      params: start=0, stop=5, step=2, endpoint=true, expected="[0. 2. 4.]"

      📌 Runtime Parameters

      params:
        start: 0
        stop: 5
        step: 2
        endpoint: True
        expected: [0. 2. 4.]
      id: 0-5-2-True-expected0
      

      📌 Setup phase

      duration:

      0.00043144822120666504
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003731055185198784
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00022077839821577072
      

      outcome:

      passed
      
    • Test 300
      params: start=0, stop=5, step=2, endpoint=false, expected="[0. 2.]"

      📌 Runtime Parameters

      params:
        start: 0
        stop: 5
        step: 2
        endpoint: False
        expected: [0. 2.]
      id: 0-5-2-False-expected1
      

      📌 Setup phase

      duration:

      0.00039875414222478867
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003398256376385689
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020993594080209732
      

      outcome:

      passed
      
    • Test 301
      params: start=-1, stop=2, step=1.5, endpoint=true, expected="[-1. 0.5 2. ]"

      📌 Runtime Parameters

      params:
        start: -1
        stop: 2
        step: 1.5
        endpoint: True
        expected: [-1.   0.5  2. ]
      id: -1-2-1.5-True-expected2
      

      📌 Setup phase

      duration:

      0.0003857286646962166
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00034135952591896057
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00021054036915302277
      

      outcome:

      passed
      
    • Test 302
      params: start=-1, stop=2, step=1.5, endpoint=false, expected="[-1. 0.5]"

      📌 Runtime Parameters

      params:
        start: -1
        stop: 2
        step: 1.5
        endpoint: False
        expected: [-1.   0.5]
      id: -1-2-1.5-False-expected3
      

      📌 Setup phase

      duration:

      0.0003829086199402809
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00032476894557476044
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020194146782159805
      

      outcome:

      passed
      
    • Test 303
      params: start=-2, stop=1, step=1.2, endpoint=true, expected="[-2. -0.8 0.4]"

      📌 Runtime Parameters

      params:
        start: -2
        stop: 1
        step: 1.2
        endpoint: True
        expected: [-2.  -0.8  0.4]
      id: -2-1-1.2-True-expected4
      

      📌 Setup phase

      duration:

      0.0004072710871696472
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003503067418932915
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002244887873530388
      

      outcome:

      passed
      
    • Test 304
      params: start=5, stop=0, step=-2, endpoint=true, expected="[0. 2. 4.]"

      📌 Runtime Parameters

      params:
        start: 5
        stop: 0
        step: -2
        endpoint: True
        expected: [0. 2. 4.]
      id: 5-0--2-True-expected5
      

      📌 Setup phase

      duration:

      0.0003851568326354027
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00033981166779994965
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002070711925625801
      

      outcome:

      passed
      
    • Test 305
      params: start=5, stop=0, step=-2, endpoint=false, expected="[0. 2.]"

      📌 Runtime Parameters

      params:
        start: 5
        stop: 0
        step: -2
        endpoint: False
        expected: [0. 2.]
      id: 5-0--2-False-expected6
      

      📌 Setup phase

      duration:

      0.0004045683890581131
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00045603327453136444
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002130698412656784
      

      outcome:

      passed
      

    Function: test_nice_steps_right_aligned

    • Test 306
      params: start=0, stop=5, step=2, endpoint=true, expected="[1. 3. 5.]"

      📌 Runtime Parameters

      params:
        start: 0
        stop: 5
        step: 2
        endpoint: True
        expected: [1. 3. 5.]
      id: 0-5-2-True-expected0
      

      📌 Setup phase

      duration:

      0.0003950735554099083
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00047697219997644424
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020282063633203506
      

      outcome:

      passed
      
    • Test 307
      params: start=0, stop=5, step=2, endpoint=false, expected="[3. 5.]"

      📌 Runtime Parameters

      params:
        start: 0
        stop: 5
        step: 2
        endpoint: False
        expected: [3. 5.]
      id: 0-5-2-False-expected1
      

      📌 Setup phase

      duration:

      0.0004025893285870552
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00033948104828596115
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020315125584602356
      

      outcome:

      passed
      
    • Test 308
      params: start=-1, stop=2, step=1.5, endpoint=true, expected="[-1. 0.5 2. ]"

      📌 Runtime Parameters

      params:
        start: -1
        stop: 2
        step: 1.5
        endpoint: True
        expected: [-1.   0.5  2. ]
      id: -1-2-1.5-True-expected2
      

      📌 Setup phase

      duration:

      0.00041953474283218384
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003585526719689369
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00021300185471773148
      

      outcome:

      passed
      
    • Test 309
      params: start=-1, stop=2, step=1.5, endpoint=false, expected="[0.5 2. ]"

      📌 Runtime Parameters

      params:
        start: -1
        stop: 2
        step: 1.5
        endpoint: False
        expected: [0.5 2. ]
      id: -1-2-1.5-False-expected3
      

      📌 Setup phase

      duration:

      0.00039831362664699554
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00034608226269483566
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00024174991995096207
      

      outcome:

      passed
      
    • Test 310
      params: start=5, stop=0, step=-2, endpoint=true, expected="[1. 3. 5.]"

      📌 Runtime Parameters

      params:
        start: 5
        stop: 0
        step: -2
        endpoint: True
        expected: [1. 3. 5.]
      id: 5-0--2-True-expected4
      

      📌 Setup phase

      duration:

      0.000431230291724205
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003545451909303665
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00022106803953647614
      

      outcome:

      passed
      
    • Test 311
      params: start=5, stop=0, step=-2, endpoint=false, expected="[3. 5.]"

      📌 Runtime Parameters

      params:
        start: 5
        stop: 0
        step: -2
        endpoint: False
        expected: [3. 5.]
      id: 5-0--2-False-expected5
      

      📌 Setup phase

      duration:

      0.0004291124641895294
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003929911181330681
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00021052826195955276
      

      outcome:

      passed
      
    • Test 312
      params: start=-3, stop=3, step=2, endpoint=true, expected="[-3. -1. 1. 3.]"

      📌 Runtime Parameters

      params:
        start: -3
        stop: 3
        step: 2
        endpoint: True
        expected: [-3. -1.  1.  3.]
      id: -3-3-2-True-expected6
      

      📌 Setup phase

      duration:

      0.0003894791007041931
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00035121385008096695
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00024054478853940964
      

      outcome:

      passed
      

    Function: test_within_scalar

    • Test 313
      params: val=5, vmin=0, vmax=10, expected=true

      📌 Runtime Parameters

      params:
        val: 5
        vmin: 0
        vmax: 10
        expected: True
      id: 5-0-10-True
      

      📌 Setup phase

      duration:

      0.00038316287100315094
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015842542052268982
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.000189976766705513
      

      outcome:

      passed
      
    • Test 314
      params: val=5, vmin=6, vmax=10, expected=false

      📌 Runtime Parameters

      params:
        val: 5
        vmin: 6
        vmax: 10
        expected: False
      id: 5-6-10-False
      

      📌 Setup phase

      duration:

      0.0003582518547773361
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014659762382507324
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019077956676483154
      

      outcome:

      passed
      
    • Test 315
      params: val=5, vmin=null, vmax=10, expected=true

      📌 Runtime Parameters

      params:
        val: 5
        vmin: None
        vmax: 10
        expected: True
      id: 5-None-10-True
      

      📌 Setup phase

      duration:

      0.0003127194941043854
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001420285552740097
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016892515122890472
      

      outcome:

      passed
      
    • Test 316
      params: val=5, vmin=0, vmax=null, expected=true

      📌 Runtime Parameters

      params:
        val: 5
        vmin: 0
        vmax: None
        expected: True
      id: 5-0-None-True
      

      📌 Setup phase

      duration:

      0.00036285724490880966
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015304610133171082
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017658155411481857
      

      outcome:

      passed
      
    • Test 317
      params: val=5, vmin=null, vmax=null, expected=true

      📌 Runtime Parameters

      params:
        val: 5
        vmin: None
        vmax: None
        expected: True
      id: 5-None-None-True
      

      📌 Setup phase

      duration:

      0.0003080582246184349
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001405421644449234
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017193332314491272
      

      outcome:

      passed
      

    Function: test_within_fraction

    • Test 318
      params: data=[1, 2, 3, 4, 5], vmin=2, vmax=5, expected=0.6

      📌 Runtime Parameters

      params:
        data:
          - 1
          - 2
          - 3
          - 4
          - 5
        vmin: 2
        vmax: 5
        expected: 0.6
      id: data0-2-5-0.6
      

      📌 Setup phase

      duration:

      0.00030972063541412354
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003580031916499138
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019222497940063477
      

      outcome:

      passed
      
    • Test 319
      params: data=[10, 20, 30], vmin=5, vmax=25, expected=0.6666666666666666

      📌 Runtime Parameters

      params:
        data:
          - 10
          - 20
          - 30
        vmin: 5
        vmax: 25
        expected: 0.6666666666666666
      id: data1-5-25-0.6666666666666666
      

      📌 Setup phase

      duration:

      0.00033048074692487717
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00024907011538743973
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019148830324411392
      

      outcome:

      passed
      
    • Test 320
      params: data=[1, 2, 3], vmin=null, vmax=2, expected=0.3333333333333333

      📌 Runtime Parameters

      params:
        data:
          - 1
          - 2
          - 3
        vmin: None
        vmax: 2
        expected: 0.3333333333333333
      id: data2-None-2-0.3333333333333333
      

      📌 Setup phase

      duration:

      0.0003253025934100151
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002452647313475609
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019301846623420715
      

      outcome:

      passed
      
    • Test 321
      params: data=[], vmin=0, vmax=1, expected=0

      📌 Runtime Parameters

      params:
        data:
      []
        vmin: 0
        vmax: 1
        expected: 0
      id: data3-0-1-0
      

      📌 Setup phase

      duration:

      0.00033661071211099625
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002526473253965378
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020268652588129044
      

      outcome:

      passed
      

    Function: test_fraction_to_percentage

    • Test 322
      params: fraction=0.456, ndigits=1, expected=45.6

      📌 Runtime Parameters

      params:
        fraction: 0.456
        ndigits: 1
        expected: 45.6
      id: 0.456-1-45.6
      

      📌 Setup phase

      duration:

      0.0003041103482246399
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016263406723737717
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016872864216566086
      

      outcome:

      passed
      
    • Test 323
      params: fraction=0.12345, ndigits=2, expected=12.35

      📌 Runtime Parameters

      params:
        fraction: 0.12345
        ndigits: 2
        expected: 12.35
      id: 0.12345-2-12.35
      

      📌 Setup phase

      duration:

      0.0002795429900288582
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014368630945682526
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016309041529893875
      

      outcome:

      passed
      
    • Test 324
      params: fraction=0.9999, ndigits=0, expected=100.0

      📌 Runtime Parameters

      params:
        fraction: 0.9999
        ndigits: 0
        expected: 100.0
      id: 0.9999-0-100.0
      

      📌 Setup phase

      duration:

      0.00030110403895378113
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015835091471672058
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001585930585861206
      

      outcome:

      passed
      

    Function: test_get_dtype

    • Test 325
      params: val="[1 2 3]", expected=""

      📌 Runtime Parameters

      params:
        val: [1 2 3]
        expected: <class 'numpy.ndarray'>
      id: val0-ndarray
      

      📌 Setup phase

      duration:

      0.0002211499959230423
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014520436525344849
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016265641897916794
      

      outcome:

      passed
      
    • Test 326
      params: val=[1, 2, 3], expected=""

      📌 Runtime Parameters

      params:
        val:
          - 1
          - 2
          - 3
        expected: <class 'list'>
      id: val1-list
      

      📌 Setup phase

      duration:

      0.00026999227702617645
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001404397189617157
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016340985894203186
      

      outcome:

      passed
      
    • Test 327
      params: val=3.14, expected=""

      📌 Runtime Parameters

      params:
        val: 3.14
        expected: <class 'float'>
      id: 3.14-float
      

      📌 Setup phase

      duration:

      0.00023226626217365265
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001513371244072914
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001378227025270462
      

      outcome:

      passed
      

    Function: test_get_shape

    • Test 328
      params: val="1 2]\n [3 4", expected=[2, 2]

      📌 Runtime Parameters

      params:
        val: [[1 2]
       [3 4]]
        expected:
          - 2
          - 2
      id: val0-expected0
      

      📌 Setup phase

      duration:

      0.00021795742213726044
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001388099044561386
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016025733202695847
      

      outcome:

      passed
      
    • Test 329
      params: val=[1, 2, 3], expected=[]

      📌 Runtime Parameters

      params:
        val:
          - 1
          - 2
          - 3
        expected:
      []
      id: val1-expected1
      

      📌 Setup phase

      duration:

      0.00025877077132463455
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015003979206085205
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015207473188638687
      

      outcome:

      passed
      
    • Test 330
      params: val=42, expected=[]

      📌 Runtime Parameters

      params:
        val: 42
        expected:
      []
      id: 42-expected2
      

      📌 Setup phase

      duration:

      0.00024235621094703674
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014329701662063599
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015176460146903992
      

      outcome:

      passed
      

    Function: test_is_array

    • Test 331
      params: val="[1 2 3]", expected=true

      📌 Runtime Parameters

      params:
        val: [1 2 3]
        expected: True
      id: val0-True
      

      📌 Setup phase

      duration:

      0.00023484230041503906
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015213806182146072
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017561763525009155
      

      outcome:

      passed
      
    • Test 332
      params: val=[1, 2, 3], expected=false

      📌 Runtime Parameters

      params:
        val:
          - 1
          - 2
          - 3
        expected: False
      id: val1-False
      

      📌 Setup phase

      duration:

      0.00036533642560243607
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001779543235898018
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015300791710615158
      

      outcome:

      passed
      
    • Test 333
      params: val=42, expected=false

      📌 Runtime Parameters

      params:
        val: 42
        expected: False
      id: 42-False
      

      📌 Setup phase

      duration:

      0.00024067051708698273
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001508435234427452
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001521967351436615
      

      outcome:

      passed
      
  • 📄 test_utils_path.py

    Function: test_can_create_all_files_user_says_yes

    • Test 334

      📌 Setup phase

      duration:

      0.00012215692549943924
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0007079495117068291
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012648757547140121
      

      outcome:

      passed
      

    Function: test_can_create_all_files_user_says_no

    • Test 335

      📌 Setup phase

      duration:

      0.0001309448853135109
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003996659070253372
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011193472892045975
      

      outcome:

      passed
      

    Function: test_make_missing_dir_creates_folder

    • Test 336

      📌 Setup phase

      duration:

      0.00013026408851146698
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005111861974000931
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011341460049152374
      

      outcome:

      passed
      

    Function: test_glob_files_returns_matching_files_only

    • Test 337

      📌 Setup phase

      duration:

      0.00011506769806146622
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0010583093389868736
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001293560490012169
      

      outcome:

      passed
      

    Function: test_filter_files_excludes_directories

    • Test 338

      📌 Setup phase

      duration:

      0.00013498682528734207
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006133429706096649
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001315893605351448
      

      outcome:

      passed
      
  • 📄 test_utils_picklio.py

    Function: test_pickle_and_unpickle

    • Test 339
      params: test_obj={"a": 1, "b": [2, 3], "c": {"world": "ok"}}

      📌 Runtime Parameters

      params:
        test_obj:
          a: 1
          b:
            - 2
            - 3
          c:
            world: ok
      id: test_obj0
      

      📌 Setup phase

      duration:

      0.000673939473927021
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003613904118537903
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019331276416778564
      

      outcome:

      passed
      
    • Test 340
      params: test_obj=[1, 2, 3, 4, 5]

      📌 Runtime Parameters

      params:
        test_obj:
          - 1
          - 2
          - 3
          - 4
          - 5
      id: test_obj1
      

      📌 Setup phase

      duration:

      0.0006378507241606712
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003231177106499672
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019275490194559097
      

      outcome:

      passed
      
    • Test 341
      params: test_obj="simple string"

      📌 Runtime Parameters

      params:
        test_obj: simple string
      id: simple string
      

      📌 Setup phase

      duration:

      0.0005576442927122116
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003673071041703224
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016660522669553757
      

      outcome:

      passed
      
    • Test 342
      params: test_obj=42

      📌 Runtime Parameters

      params:
        test_obj: 42
      id: 42
      

      📌 Setup phase

      duration:

      0.0006065089255571365
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00031733326613903046
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016919150948524475
      

      outcome:

      passed
      
    • Test 343
      params: test_obj=3.14159

      📌 Runtime Parameters

      params:
        test_obj: 3.14159
      id: 3.14159
      

      📌 Setup phase

      duration:

      0.0005785003304481506
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003104116767644882
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001736227422952652
      

      outcome:

      passed
      
    • Test 344
      params: test_obj=[true, false, null]

      📌 Runtime Parameters

      params:
        test_obj:
          - True
          - (vide)
          - (vide)
      id: test_obj5
      

      📌 Setup phase

      duration:

      0.0005262373015284538
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00032655615359544754
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001723058521747589
      

      outcome:

      passed
      
    • Test 345
      params: test_obj={"complex": [{"list": [1, 2]}, {"dict": {"x": 10}}]}

      📌 Runtime Parameters

      params:
        test_obj:
          complex:
            -         list:
                - 1
                - 2
            -         dict:
                x: 10
      id: test_obj6
      

      📌 Setup phase

      duration:

      0.0005420753732323647
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003317929804325104
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017655547708272934
      

      outcome:

      passed
      
  • 📄 test_utils_printing.py

    Function: test_maxlen_valid

    • Test 346
      params: seq=["a", "abc", ""], expected=3

      📌 Runtime Parameters

      params:
        seq:
          - a
          - abc
          - (vide)
        expected: 3
      id: seq0-3
      

      📌 Setup phase

      duration:

      0.00031782686710357666
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002041831612586975
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017543137073516846
      

      outcome:

      passed
      
    • Test 347
      params: seq=[], expected=0

      📌 Runtime Parameters

      params:
        seq:
      []
        expected: 0
      id: seq1-0
      

      📌 Setup phase

      duration:

      0.00028238072991371155
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016332324594259262
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016776006668806076
      

      outcome:

      passed
      
    • Test 348
      params: seq=1, 2], [3], [4, 5, 6, expected=3

      📌 Runtime Parameters

      params:
        seq:
          -       - 1
            - 2
          -       - 3
          -       - 4
            - 5
            - 6
        expected: 3
      id: seq2-3
      

      📌 Setup phase

      duration:

      0.00022896192967891693
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015220791101455688
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015829969197511673
      

      outcome:

      passed
      
    • Test 349
      params: seq=[{"a": 2, "b": 3}, {}, {"c": 4}], expected=2

      📌 Runtime Parameters

      params:
        seq:
          -       a: 2
            b: 3
          - (vide)
          -       c: 4
        expected: 2
      id: seq3-2
      

      📌 Setup phase

      duration:

      0.00022676773369312286
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015715882182121277
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015165843069553375
      

      outcome:

      passed
      

    Function: test_strlen

    • Test 350
      params: value=42, expected=2

      📌 Runtime Parameters

      params:
        value: 42
        expected: 2
      id: 42-2
      

      📌 Setup phase

      duration:

      0.0002573709934949875
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014965515583753586
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014189071953296661
      

      outcome:

      passed
      
    • Test 351
      params: value="hello", expected=5

      📌 Runtime Parameters

      params:
        value: hello
        expected: 5
      id: hello-5
      

      📌 Setup phase

      duration:

      0.00023753847926855087
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013535842299461365
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001352587714791298
      

      outcome:

      passed
      
    • Test 352
      params: value=false, expected=5

      📌 Runtime Parameters

      params:
        value: False
        expected: 5
      id: False-5
      

      📌 Setup phase

      duration:

      0.00022822152823209763
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014585908502340317
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00022791512310504913
      

      outcome:

      passed
      
    • Test 353
      params: value=null, expected=4

      📌 Runtime Parameters

      params:
        value: None
        expected: 4
      id: None-4
      

      📌 Setup phase

      duration:

      0.0002387501299381256
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014003459364175797
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014217756688594818
      

      outcome:

      passed
      
    • Test 354
      params: value=[1, 2, 3], expected=9

      📌 Runtime Parameters

      params:
        value:
          - 1
          - 2
          - 3
        expected: 9
      id: value4-9
      

      📌 Setup phase

      duration:

      0.00023028813302516937
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015357881784439087
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014233309775590897
      

      outcome:

      passed
      
    • Test 355
      params: value={"a": 1}, expected=8

      📌 Runtime Parameters

      params:
        value:
          a: 1
        expected: 8
      id: value5-8
      

      📌 Setup phase

      duration:

      0.00024249032139778137
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015852414071559906
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015759561210870743
      

      outcome:

      passed
      
    • Test 356
      params: value=[1, 2], expected=6

      📌 Runtime Parameters

      params:
        value:
          - 1
          - 2
        expected: 6
      id: value6-6
      

      📌 Setup phase

      duration:

      0.0002702949568629265
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016710814088582993
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015793461352586746
      

      outcome:

      passed
      
    • Test 357
      params: value="", expected=0

      📌 Runtime Parameters

      params:
        value: None
        expected: 0
      id: -0
      

      📌 Setup phase

      duration:

      0.0002801278606057167
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016803666949272156
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016311556100845337
      

      outcome:

      passed
      
    • Test 358
      params: value="this is a phrase", expected=16

      📌 Runtime Parameters

      params:
        value: this is a phrase
        expected: 16
      id: this is a phrase-16
      

      📌 Setup phase

      duration:

      0.00026938319206237793
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00022267736494541168
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001465221866965294
      

      outcome:

      passed
      

    Function: test_maxstrlen

    • Test 359
      params: seq=[1, true, 3.1415], expected=6

      📌 Runtime Parameters

      params:
        seq:
          - 1
          - True
          - 3.1415
        expected: 6
      id: seq0-6
      

      📌 Setup phase

      duration:

      0.00023919250816106796
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016390997916460037
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014946982264518738
      

      outcome:

      passed
      
    • Test 360
      params: seq=["aa", "bbb", "c"], expected=3

      📌 Runtime Parameters

      params:
        seq:
          - aa
          - bbb
          - c
        expected: 3
      id: seq1-3
      

      📌 Setup phase

      duration:

      0.00022652558982372284
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000167015939950943
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014821812510490417
      

      outcome:

      passed
      
    • Test 361
      params: seq=1, 2], [], [1, 2, 3, expected=9

      📌 Runtime Parameters

      params:
        seq:
          -       - 1
            - 2
          - (vide)
          -       - 1
            - 2
            - 3
        expected: 9
      id: seq2-9
      

      📌 Setup phase

      duration:

      0.00028493162244558334
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00021072570234537125
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002112286165356636
      

      outcome:

      passed
      
    • Test 362
      params: seq=[{"a": 1}, {}, {"a": 1, "b": 2}], expected=16

      📌 Runtime Parameters

      params:
        seq:
          -       a: 1
          - (vide)
          -       a: 1
            b: 2
        expected: 16
      id: seq3-16
      

      📌 Setup phase

      duration:

      0.0002390025183558464
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015321746468544006
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001410171389579773
      

      outcome:

      passed
      
    • Test 363
      params: seq=[null, false, 12345], expected=5

      📌 Runtime Parameters

      params:
        seq:
          - (vide)
          - (vide)
          - 12345
        expected: 5
      id: seq4-5
      

      📌 Setup phase

      duration:

      0.0002251574769616127
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014829915016889572
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016284827142953873
      

      outcome:

      passed
      

    Function: test_transpose_matrix

    • Test 364
      params: data=1, 2], [3, 4, expected=1, 3], [2, 4

      📌 Runtime Parameters

      params:
        data:
          -       - 1
            - 2
          -       - 3
            - 4
        expected:
          -       - 1
            - 3
          -       - 2
            - 4
      id: data0-expected0
      

      📌 Setup phase

      duration:

      0.00023013632744550705
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013839080929756165
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015195365995168686
      

      outcome:

      passed
      
    • Test 365

      📌 Runtime Parameters

      params:
        data:
          -       - a
            - b
          -       - c
            - d
        expected:
          -       - a
            - c
          -       - b
            - d
      id: data1-expected1
      

      📌 Setup phase

      duration:

      0.0002325093373656273
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014508701860904694
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013941992074251175
      

      outcome:

      passed
      
    • Test 366
      params: data={"x": 1}, {"y": 2}], [{"x": 3}, {"y": 4}, expected={"x": 1}, {"x": 3}], [{"y": 2}, {"y": 4}

      📌 Runtime Parameters

      params:
        data:
          -       -         x: 1
            -         y: 2
          -       -         x: 3
            -         y: 4
        expected:
          -       -         x: 1
            -         x: 3
          -       -         y: 2
            -         y: 4
      id: data2-expected2
      

      📌 Setup phase

      duration:

      0.00023371446877717972
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001418422907590866
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015062838792800903
      

      outcome:

      passed
      

    Function: test_prepend

    • Test 367
      params: initial=[1, 2, 3], prepend=1, expected=[1, 2, 3]

      📌 Runtime Parameters

      params:
        initial:
          - 1
          - 2
          - 3
        prepend: 1
        expected:
          - 1
          - 2
          - 3
      id: initial0-1-expected0
      

      📌 Setup phase

      duration:

      0.0002656523138284683
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015316717326641083
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015743356198072433
      

      outcome:

      passed
      
    • Test 368
      params: initial=["a", "b", "c"], prepend="a", expected=["a", "b", "c"]

      📌 Runtime Parameters

      params:
        initial:
          - a
          - b
          - c
        prepend: a
        expected:
          - a
          - b
          - c
      id: initial1-a-expected1
      

      📌 Setup phase

      duration:

      0.00027233734726905823
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014480389654636383
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015887990593910217
      

      outcome:

      passed
      
    • Test 369
      params: initial=[{"a": 1}, {"b": 2}], prepend={"a": 1}, expected=[{"a": 1}, {"b": 2}]

      📌 Runtime Parameters

      params:
        initial:
          -       a: 1
          -       b: 2
        prepend:
          a: 1
        expected:
          -       a: 1
          -       b: 2
      id: initial2-prepend2-expected2
      

      📌 Setup phase

      duration:

      0.00026525743305683136
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014288723468780518
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001542065292596817
      

      outcome:

      passed
      
    • Test 370
      params: initial=1], [2], [3, prepend=[1], expected=1], [2], [3

      📌 Runtime Parameters

      params:
        initial:
          -       - 1
          -       - 2
          -       - 3
        prepend:
          - 1
        expected:
          -       - 1
          -       - 2
          -       - 3
      id: initial3-prepend3-expected3
      

      📌 Setup phase

      duration:

      0.00027327053248882294
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013393815606832504
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017524976283311844
      

      outcome:

      passed
      

    Function: test_fmt_table_line

    • Test 371
      params: entries=["a", "bbb"], widths=[3, 5], expected=" a bbb"

      📌 Runtime Parameters

      params:
        entries:
          - a
          - bbb
        widths:
          - 3
          - 5
        expected:   a   bbb
      id: entries0-widths0-  a   bbb
      

      📌 Setup phase

      duration:

      0.0002902131527662277
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014594383537769318
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001535089686512947
      

      outcome:

      passed
      
    • Test 372
      params: entries=[1, 2], widths=[2, 2], expected=" 1 2"

      📌 Runtime Parameters

      params:
        entries:
          - 1
          - 2
        widths:
          - 2
          - 2
        expected:  1  2
      id: entries1-widths1- 1  2
      

      📌 Setup phase

      duration:

      0.0002726437523961067
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001655835658311844
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001689894124865532
      

      outcome:

      passed
      
    • Test 373
      params: entries=["long", "val"], widths=[6, 4], expected=" long val"

      📌 Runtime Parameters

      params:
        entries:
          - long
          - val
        widths:
          - 6
          - 4
        expected:   long  val
      id: entries2-widths2-  long  val
      

      📌 Setup phase

      duration:

      0.00027136504650115967
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001439834013581276
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018468499183654785
      

      outcome:

      passed
      
    • Test 374
      params: entries=[true, false], widths=[5, 6], expected=" True False"

      📌 Runtime Parameters

      params:
        entries:
          - True
          - (vide)
        widths:
          - 5
          - 6
        expected:  True  False
      id: entries3-widths3- True  False
      

      📌 Setup phase

      duration:

      0.00026801135390996933
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001472504809498787
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015437882393598557
      

      outcome:

      passed
      
    • Test 375
      params: entries=[123, 4567], widths=[5, 5], expected=" 123 4567"

      📌 Runtime Parameters

      params:
        entries:
          - 123
          - 4567
        widths:
          - 5
          - 5
        expected:   123  4567
      id: entries4-widths4-  123  4567
      

      📌 Setup phase

      duration:

      0.00027166493237018585
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014689750969409943
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014904700219631195
      

      outcome:

      passed
      
    • Test 376
      params: entries=["text with space", "end"], widths=[16, 5], expected=" text with space end"

      📌 Runtime Parameters

      params:
        entries:
          - text with space
          - end
        widths:
          - 16
          - 5
        expected:  text with space   end
      id: entries5-widths5- text with space   end
      

      📌 Setup phase

      duration:

      0.00027502141892910004
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014788005501031876
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001521063968539238
      

      outcome:

      passed
      
    • Test 377
      params: entries=[{"a": 1}, {"b": 2}], widths=[10, 10], expected=" {'a': 1} {'b': 2}"

      📌 Runtime Parameters

      params:
        entries:
          -       a: 1
          -       b: 2
        widths:
          - 10
          - 10
        expected:   {'a': 1}   {'b': 2}
      id: entries6-widths6-  {'a': 1}   {'b': 2}
      

      📌 Setup phase

      duration:

      0.0002526305615901947
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00021746568381786346
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017901230603456497
      

      outcome:

      passed
      
    • Test 378
      params: entries=1, 2], [3, 4, widths=[10, 10], expected=" [1, 2] [3, 4]"

      📌 Runtime Parameters

      params:
        entries:
          -       - 1
            - 2
          -       - 3
            - 4
        widths:
          - 10
          - 10
        expected:     [1, 2]     [3, 4]
      id: entries7-widths7-    [1, 2]     [3, 4]
      

      📌 Setup phase

      duration:

      0.00027629174292087555
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016046315431594849
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001541823148727417
      

      outcome:

      passed
      

    Function: test_fmt_label_sep

    • Test 379
      params: widths=[3, 4], line="-", expected="--- ----"

      📌 Runtime Parameters

      params:
        widths:
          - 3
          - 4
        line: -
        expected: --- ----
      id: widths0------ ----
      

      📌 Setup phase

      duration:

      0.00027506425976753235
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014489702880382538
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015151500701904297
      

      outcome:

      passed
      
    • Test 380
      params: widths=[2, 3], line="=", expected="== ==="

      📌 Runtime Parameters

      params:
        widths:
          - 2
          - 3
        line: =
        expected: == ===
      id: widths1-=-== ===
      

      📌 Setup phase

      duration:

      0.00027949828654527664
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001548193395137787
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001565953716635704
      

      outcome:

      passed
      
    • Test 381
      params: widths=[5, 2], line="*", expected="***** **"

      📌 Runtime Parameters

      params:
        widths:
          - 5
          - 2
        line: *
        expected: ***** **
      id: widths2-*-***** **
      

      📌 Setup phase

      duration:

      0.0002674795687198639
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014885421842336655
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016849394887685776
      

      outcome:

      passed
      

    Function: test_printable_dict_with_header

    • Test 382
      params: d={"medium": true, "very_long_key": 3.14, "x": 1}, header="HeaderTest", expected_lines=["HeaderTest:", "-----------", "medium: True", "very_long_key: 3.14", "x: 1", ""]

      📌 Runtime Parameters

      params:
        d:
          medium: True
          very_long_key: 3.14
          x: 1
        header: HeaderTest
        expected_lines:
          - HeaderTest:
          - -----------
          - medium:        True
          - very_long_key: 3.14
          - x:             1
          - (vide)
      id: d0-HeaderTest-expected_lines0
      

      📌 Setup phase

      duration:

      0.0002614576369524002
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00022215116769075394
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001689419150352478
      

      outcome:

      passed
      

    Function: test_printable_dict_of_dicts

    • Test 383

      📌 Setup phase

      duration:

      0.0001240493729710579
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00024269800633192062
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010626018047332764
      

      outcome:

      passed
      

    Function: test_printable_table

    • Test 384
      params: data="X1", true, 0.1234, {"meta": "ok"}], ["AnotherSample", false, 98765.4321, {"meta": [1, 2, 3]}], ["Z", null, 0.0, {"meta": {"nested_key": 42}}, labels=["ID", "✓ Success?", "SuperPrecisionValue", "Result Metadata"], expected="A: ID\nB: ✓ Success?\nC: SuperPrecisionValue\nD: Result Metadata\n\n# A B C D\n- ------------- ----- ---------- ----------------------------\n0 X1 True 0.1234 {'meta': 'ok'}\n1 AnotherSample False 98765.4321 {'meta': [1, 2, 3]}\n2 Z None 0.0 {'meta': {'nested_key': 42}}"

      📌 Runtime Parameters

      params:
        data:
          -       - X1
            - True
            - 0.1234
            -         meta: ok
          -       - AnotherSample
            - (vide)
            - 98765.4321
            -         meta:
                - 1
                - 2
                - 3
          -       - Z
            - (vide)
            - (vide)
            -         meta:
                nested_key: 42
        labels:
          - ID
          -  Success?
          - SuperPrecisionValue
          - Result Metadata
        expected: A: ID
      B:  Success?
      C: SuperPrecisionValue
      D: Result Metadata
      
      #             A     B          C                            D
      - ------------- ----- ---------- ----------------------------
      0            X1  True     0.1234               {'meta': 'ok'}
      1 AnotherSample False 98765.4321          {'meta': [1, 2, 3]}
      2             Z  None        0.0 {'meta': {'nested_key': 42}}
      id: data0-labels0-A: ID\nB: \u2713 Success?\nC: SuperPrecisionValue\nD: Result Metadata\n\n#             A     B          C                            D\n- ------------- ----- ---------- ----------------------------\n0            X1  True     0.1234               {'meta': 'ok'}\n1 AnotherSample False 98765.4321          {'meta': [1, 2, 3]}\n2             Z  None        0.0 {'meta': {'nested_key': 42}}
      

      📌 Setup phase

      duration:

      0.000281323678791523
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00033572036772966385
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001898379996418953
      

      outcome:

      passed
      
  • 📄 test_utils_rangebar.py

    Function: test_full_progress_bar

    • Test 385

      📌 Setup phase

      duration:

      0.00039783306419849396
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002873707562685013
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018721912056207657
      

      outcome:

      passed
      

    Function: test_half_progress_bar

    • Test 386

      📌 Setup phase

      duration:

      0.0002925898879766464
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002156272530555725
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016038212925195694
      

      outcome:

      passed
      

    Function: test_zero_progress_bar

    • Test 387

      📌 Setup phase

      duration:

      0.00030058156698942184
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002220282331109047
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016293395310640335
      

      outcome:

      passed
      

    Function: test_overflow_bar

    • Test 388

      📌 Setup phase

      duration:

      0.0002725096419453621
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001953141763806343
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017351843416690826
      

      outcome:

      passed
      

    Function: test_underflow_bar

    • Test 389

      📌 Setup phase

      duration:

      0.0002794228494167328
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018150825053453445
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015625450760126114
      

      outcome:

      passed
      

    Function: test_repr

    • Test 390

      📌 Setup phase

      duration:

      0.00012340769171714783
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014891847968101501
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010160170495510101
      

      outcome:

      passed
      

    Function: test_each_value_separately

    • Test 391
      params: value=0, expected_bar_part=" "

      📌 Runtime Parameters

      params:
        value: 0
        expected_bar_part:           
      id: 0-          
      

      📌 Setup phase

      duration:

      0.00036961864680051804
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00019840244203805923
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00023043621331453323
      

      outcome:

      passed
      
    • Test 392
      params: value=10, expected_bar_part="█ "

      📌 Runtime Parameters

      params:
        value: 10
        expected_bar_part:          
      id: 10-\u2588         
      

      📌 Setup phase

      duration:

      0.0003772648051381111
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001917220652103424
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018651317805051804
      

      outcome:

      passed
      
    • Test 393
      params: value=25, expected_bar_part="██▌ "

      📌 Runtime Parameters

      params:
        value: 25
        expected_bar_part: ██▌       
      id: 25-\u2588\u2588\u258c       
      

      📌 Setup phase

      duration:

      0.00035892706364393234
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018987804651260376
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002515222877264023
      

      outcome:

      passed
      
    • Test 394
      params: value=27, expected_bar_part="██▊ "

      📌 Runtime Parameters

      params:
        value: 27
        expected_bar_part: ██▊       
      id: 27-\u2588\u2588\u258a       
      

      📌 Setup phase

      duration:

      0.00037061329931020737
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00019472837448120117
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019201915711164474
      

      outcome:

      passed
      
    • Test 395
      params: value=49, expected_bar_part="████▉ "

      📌 Runtime Parameters

      params:
        value: 49
        expected_bar_part: ████▉     
      id: 49-\u2588\u2588\u2588\u2588\u2589     
      

      📌 Setup phase

      duration:

      0.0003817109391093254
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00019401498138904572
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019166059792041779
      

      outcome:

      passed
      
    • Test 396
      params: value=50, expected_bar_part="█████ "

      📌 Runtime Parameters

      params:
        value: 50
        expected_bar_part: █████     
      id: 50-\u2588\u2588\u2588\u2588\u2588     
      

      📌 Setup phase

      duration:

      0.0003505200147628784
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00020549912005662918
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019474513828754425
      

      outcome:

      passed
      
    • Test 397
      params: value=51, expected_bar_part="█████▏ "

      📌 Runtime Parameters

      params:
        value: 51
        expected_bar_part: █████▏    
      id: 51-\u2588\u2588\u2588\u2588\u2588\u258f    
      

      📌 Setup phase

      duration:

      0.0003861282020807266
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002018539234995842
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019170716404914856
      

      outcome:

      passed
      
    • Test 398
      params: value=73, expected_bar_part="███████▎ "

      📌 Runtime Parameters

      params:
        value: 73
        expected_bar_part: ███████▎  
      id: 73-\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258e  
      

      📌 Setup phase

      duration:

      0.00035852473229169846
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00019216258078813553
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019187666475772858
      

      outcome:

      passed
      
    • Test 399
      params: value=75, expected_bar_part="███████▌ "

      📌 Runtime Parameters

      params:
        value: 75
        expected_bar_part: ███████▌  
      id: 75-\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258c  
      

      📌 Setup phase

      duration:

      0.00034382473677396774
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018483027815818787
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001942310482263565
      

      outcome:

      passed
      
    • Test 400
      params: value=90, expected_bar_part="█████████ "

      📌 Runtime Parameters

      params:
        value: 90
        expected_bar_part: █████████ 
      id: 90-\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 
      

      📌 Setup phase

      duration:

      0.0003773001953959465
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018905475735664368
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0010829372331500053
      

      outcome:

      passed
      
    • Test 401
      params: value=100, expected_bar_part="██████████"

      📌 Runtime Parameters

      params:
        value: 100
        expected_bar_part: ██████████
      id: 100-\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588
      

      📌 Setup phase

      duration:

      0.00039673224091529846
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00019559264183044434
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00021115317940711975
      

      outcome:

      passed
      
  • 📄 test_utils_readable.py

    Function: test_readable_seconds

    • Test 402
      params: seconds=59.4, expected="59 seconds"

      📌 Runtime Parameters

      params:
        seconds: 59.4
        expected: 59 seconds
      id: 59.4-59 seconds
      

      📌 Setup phase

      duration:

      0.0002680458128452301
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00017710961401462555
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001557581126689911
      

      outcome:

      passed
      
    • Test 403
      params: seconds=59.9, expected="60 seconds"

      📌 Runtime Parameters

      params:
        seconds: 59.9
        expected: 60 seconds
      id: 59.9-60 seconds
      

      📌 Setup phase

      duration:

      0.00024943985044956207
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000145656056702137
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013959314674139023
      

      outcome:

      passed
      
    • Test 404
      params: seconds=119.9, expected="120 seconds"

      📌 Runtime Parameters

      params:
        seconds: 119.9
        expected: 120 seconds
      id: 119.9-120 seconds
      

      📌 Setup phase

      duration:

      0.0002281051129102707
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014252401888370514
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014486443251371384
      

      outcome:

      passed
      
    • Test 405
      params: seconds=120.1, expected="2 minutes"

      📌 Runtime Parameters

      params:
        seconds: 120.1
        expected: 2 minutes
      id: 120.1-2 minutes
      

      📌 Setup phase

      duration:

      0.00023251213133335114
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014302507042884827
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015048962086439133
      

      outcome:

      passed
      
    • Test 406
      params: seconds=3599.9, expected="60 minutes"

      📌 Runtime Parameters

      params:
        seconds: 3599.9
        expected: 60 minutes
      id: 3599.9-60 minutes
      

      📌 Setup phase

      duration:

      0.0002282196655869484
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014075357466936111
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015003979206085205
      

      outcome:

      passed
      
    • Test 407
      params: seconds=3600.1, expected="60 minutes"

      📌 Runtime Parameters

      params:
        seconds: 3600.1
        expected: 60 minutes
      id: 3600.1-60 minutes
      

      📌 Setup phase

      duration:

      0.00021392758935689926
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001424551010131836
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014019664376974106
      

      outcome:

      passed
      
    • Test 408
      params: seconds=7199.9, expected="120 minutes"

      📌 Runtime Parameters

      params:
        seconds: 7199.9
        expected: 120 minutes
      id: 7199.9-120 minutes
      

      📌 Setup phase

      duration:

      0.00021688267588615417
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013585761189460754
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015390850603580475
      

      outcome:

      passed
      
    • Test 409
      params: seconds=7200.1, expected="2 hours"

      📌 Runtime Parameters

      params:
        seconds: 7200.1
        expected: 2 hours
      id: 7200.1-2 hours
      

      📌 Setup phase

      duration:

      0.00022308900952339172
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00017077475786209106
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014170072972774506
      

      outcome:

      passed
      
    • Test 410
      params: seconds=90.4, expected="90 seconds"

      📌 Runtime Parameters

      params:
        seconds: 90.4
        expected: 90 seconds
      id: 90.4-90 seconds
      

      📌 Setup phase

      duration:

      0.00021931715309619904
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014019012451171875
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014303438365459442
      

      outcome:

      passed
      
    • Test 411
      params: seconds=90.6, expected="91 seconds"

      📌 Runtime Parameters

      params:
        seconds: 90.6
        expected: 91 seconds
      id: 90.6-91 seconds
      

      📌 Setup phase

      duration:

      0.00023656338453292847
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001449286937713623
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001355363056063652
      

      outcome:

      passed
      
    • Test 412
      params: seconds=121.9, expected="2 minutes"

      📌 Runtime Parameters

      params:
        seconds: 121.9
        expected: 2 minutes
      id: 121.9-2 minutes
      

      📌 Setup phase

      duration:

      0.00023360084742307663
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014652404934167862
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014035962522029877
      

      outcome:

      passed
      
    • Test 413
      params: seconds=1296000.0, expected="2 weeks"

      📌 Runtime Parameters

      params:
        seconds: 1296000.0
        expected: 2 weeks
      id: 1296000.0-2 weeks
      

      📌 Setup phase

      duration:

      0.00021496601402759552
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015494786202907562
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001469319686293602
      

      outcome:

      passed
      
    • Test 414
      params: seconds=2592000.0, expected="4 weeks"

      📌 Runtime Parameters

      params:
        seconds: 2592000.0
        expected: 4 weeks
      id: 2592000.0-4 weeks
      

      📌 Setup phase

      duration:

      0.00023168325424194336
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001418832689523697
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013705343008041382
      

      outcome:

      passed
      
    • Test 415
      params: seconds=2800000.0, expected="5 weeks"

      📌 Runtime Parameters

      params:
        seconds: 2800000.0
        expected: 5 weeks
      id: 2800000.0-5 weeks
      

      📌 Setup phase

      duration:

      0.00023981556296348572
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001443745568394661
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015034247189760208
      

      outcome:

      passed
      
    • Test 416
      params: seconds=3888000.0, expected="6 weeks"

      📌 Runtime Parameters

      params:
        seconds: 3888000.0
        expected: 6 weeks
      id: 3888000.0-6 weeks
      

      📌 Setup phase

      duration:

      0.00021354295313358307
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001367628574371338
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014993175864219666
      

      outcome:

      passed
      
    • Test 417
      params: seconds=5097600.0, expected="8 weeks"

      📌 Runtime Parameters

      params:
        seconds: 5097600.0
        expected: 8 weeks
      id: 5097600.0-8 weeks
      

      📌 Setup phase

      duration:

      0.00022456608712673187
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014156289398670197
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001368178054690361
      

      outcome:

      passed
      
    • Test 418
      params: seconds=5184000.0, expected="9 weeks"

      📌 Runtime Parameters

      params:
        seconds: 5184000.0
        expected: 9 weeks
      id: 5184000.0-9 weeks
      

      📌 Setup phase

      duration:

      0.0002543320879340172
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000160999596118927
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014292355626821518
      

      outcome:

      passed
      
    • Test 419
      params: seconds=5270400.0, expected="2 months"

      📌 Runtime Parameters

      params:
        seconds: 5270400.0
        expected: 2 months
      id: 5270400.0-2 months
      

      📌 Setup phase

      duration:

      0.00022014137357473373
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001573534682393074
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014860928058624268
      

      outcome:

      passed
      
    • Test 420
      params: seconds=23328000.0, expected="9 months"

      📌 Runtime Parameters

      params:
        seconds: 23328000.0
        expected: 9 months
      id: 23328000.0-9 months
      

      📌 Setup phase

      duration:

      0.00021358393132686615
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013945996761322021
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.000146511010825634
      

      outcome:

      passed
      
    • Test 421
      params: seconds=31104000.0, expected="12 months"

      📌 Runtime Parameters

      params:
        seconds: 31104000.0
        expected: 12 months
      id: 31104000.0-12 months
      

      📌 Setup phase

      duration:

      0.00023531168699264526
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014470238238573074
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013643968850374222
      

      outcome:

      passed
      
    • Test 422
      params: seconds=33696000.0, expected="13 months"

      📌 Runtime Parameters

      params:
        seconds: 33696000.0
        expected: 13 months
      id: 33696000.0-13 months
      

      📌 Setup phase

      duration:

      0.00023005064576864243
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001623239368200302
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013789720833301544
      

      outcome:

      passed
      
    • Test 423
      params: seconds=59616000.0, expected="23 months"

      📌 Runtime Parameters

      params:
        seconds: 59616000.0
        expected: 23 months
      id: 59616000.0-23 months
      

      📌 Setup phase

      duration:

      0.00022328179329633713
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014129560440778732
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013771001249551773
      

      outcome:

      passed
      
    • Test 424
      params: seconds=62208000.0, expected="24 months"

      📌 Runtime Parameters

      params:
        seconds: 62208000.0
        expected: 24 months
      id: 62208000.0-24 months
      

      📌 Setup phase

      duration:

      0.0002204999327659607
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001376243308186531
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014153029769659042
      

      outcome:

      passed
      
    • Test 425
      params: seconds=64208000.0, expected="2 years"

      📌 Runtime Parameters

      params:
        seconds: 64208000.0
        expected: 2 years
      id: 64208000.0-2 years
      

      📌 Setup phase

      duration:

      0.00023460295051336288
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001430213451385498
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013779941946268082
      

      outcome:

      passed
      
  • 📄 test_utils_registry.py

    Function: test_metaclass_creates_weakset

    • Test 426

      📌 Setup phase

      duration:

      0.00013941247016191483
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0007343962788581848
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001241341233253479
      

      outcome:

      passed
      

    Function: test_metaclass_tracks_instances

    • Test 427

      📌 Setup phase

      duration:

      0.0001849047839641571
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00025074277073144913
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010821782052516937
      

      outcome:

      passed
      

    Function: test_registry_inheritance

    • Test 428

      📌 Setup phase

      duration:

      0.00020057428628206253
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000645969994366169
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013997312635183334
      

      outcome:

      passed
      

    Function: test_instance_tracking

    • Test 429

      📌 Setup phase

      duration:

      0.0001817932352423668
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002201879397034645
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012918561697006226
      

      outcome:

      passed
      

    Function: test_collect_instances_recursive

    • Test 430

      📌 Setup phase

      duration:

      0.00018300674855709076
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0010670991614460945
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016876403242349625
      

      outcome:

      passed
      

    Function: test_instances_function

    • Test 431

      📌 Setup phase

      duration:

      0.00019640661776065826
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0010784128680825233
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014604255557060242
      

      outcome:

      passed
      

    Function: test_non_registry_class_error

    • Test 432

      📌 Setup phase

      duration:

      0.00013878662139177322
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00020520761609077454
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001048380509018898
      

      outcome:

      passed
      

    Function: test_signature_preservation

    • Test 433

      📌 Setup phase

      duration:

      0.00010904204100370407
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000254911370575428
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001155901700258255
      

      outcome:

      passed
      
  • 📄 test_utils_richcfg.py

    Function: test_rich_inspector_outputs_more_than_builtin

    • Test 434

      📌 Setup phase

      duration:

      0.0002041831612586975
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.09510857705026865
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00025777053087949753
      

      outcome:

      passed
      
  • 📄 test_utils_run_later.py

    Function: test_init_and_repr

    • Test 435

      📌 Setup phase

      duration:

      0.0001513427123427391
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002773785963654518
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011223088949918747
      

      outcome:

      passed
      

    Function: test_call

    • Test 436

      📌 Setup phase

      duration:

      0.00014131981879472733
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000176367349922657
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010269414633512497
      

      outcome:

      passed
      

    Function: test_matmul_with_string

    • Test 437

      📌 Setup phase

      duration:

      0.0001117754727602005
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016174837946891785
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010208599269390106
      

      outcome:

      passed
      

    Function: test_matmul_with_list

    • Test 438

      📌 Setup phase

      duration:

      0.00010813679546117783
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015117786824703217
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.62819904088974e-05
      

      outcome:

      passed
      

    Function: test_matmul_with_single_int

    • Test 439

      📌 Setup phase

      duration:

      0.00010922178626060486
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018255319446325302
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011182576417922974
      

      outcome:

      passed
      

    Function: test_run_at_future_triggered_and_logs

    • Test 440

      📌 Setup phase

      duration:

      0.00032292120158672333
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.2059141006320715
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0003483844920992851
      

      outcome:

      passed
      

    Function: test_run_at_already_past

    • Test 441

      📌 Setup phase

      duration:

      0.00040538888424634933
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00035165250301361084
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019865762442350388
      

      outcome:

      passed
      

    Function: test_run_in_future_triggered_and_logs

    • Test 442

      📌 Setup phase

      duration:

      0.0002672569826245308
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.20189356990158558
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00032514240592718124
      

      outcome:

      passed
      

    Function: test_run_in_past

    • Test 443

      📌 Setup phase

      duration:

      0.0003358805552124977
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0004195636138319969
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001867404207587242
      

      outcome:

      passed
      

    Function: test_run_later_with_seconds

    • Test 444

      📌 Setup phase

      duration:

      0.0002687312662601471
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.20187064353376627
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0002975836396217346
      

      outcome:

      passed
      

    Function: test_run_later_with_past_datetime

    • Test 445

      📌 Setup phase

      duration:

      0.0003116875886917114
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003220904618501663
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018257461488246918
      

      outcome:

      passed
      

    Function: test_run_at_tqdm_multiple_updates

    • Test 446

      📌 Setup phase

      duration:

      0.0003487793728709221
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.20180376339703798
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0003283051773905754
      

      outcome:

      passed
      

    Function: test_today_basic

    • Test 447

      📌 Setup phase

      duration:

      0.00014475639909505844
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0009990856051445007
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014257151633501053
      

      outcome:

      passed
      

    Function: test_tomorrow_basic

    • Test 448

      📌 Setup phase

      duration:

      0.00012174714356660843
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00037484802305698395
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001129666343331337
      

      outcome:

      passed
      

    Function: test_yesterday_basic

    • Test 449

      📌 Setup phase

      duration:

      0.00012648571282625198
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003476794809103012
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010656006634235382
      

      outcome:

      passed
      

    Function: test_today_matmul_string

    • Test 450

      📌 Setup phase

      duration:

      0.00011585000902414322
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00033468566834926605
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010923761874437332
      

      outcome:

      passed
      

    Function: test_tomorrow_matmul_list

    • Test 451

      📌 Setup phase

      duration:

      0.00011180434376001358
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003734547644853592
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010966230183839798
      

      outcome:

      passed
      

    Function: test_yesterday_matmul_single

    • Test 452

      📌 Setup phase

      duration:

      0.00010870769619941711
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003500981256365776
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012420210987329483
      

      outcome:

      passed
      
  • 📄 test_utils_sendmail.py

    Function: test_sendmail_local_delivery

    • Test 453

      📌 Setup phase

      duration:

      0.0001401444897055626
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.16142921894788742
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00024793297052383423
      

      outcome:

      passed
      

    Function: test_sendmail_raises_on_sendmail_failure

    • Test 454

      📌 Setup phase

      duration:

      0.00033960212022066116
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0007421271875500679
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016925763338804245
      

      outcome:

      passed
      
  • 📄 test_utils_sendsms.py

    Function: test_sendsms_local_delivery

    • Test 455

      📌 Setup phase

      duration:

      0.000134369358420372
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.11848229914903641
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0003318367525935173
      

      outcome:

      passed
      
  • 📄 test_utils_shortcut.py

    Function: TestShortcutInitialization

    • Test 456

      📌 Setup phase

      duration:

      0.00041194260120391846
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0002510072663426399
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017014797776937485
      

      outcome:

      passed
      
    • Test 457

      📌 Setup phase

      duration:

      0.000209820456802845
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001601744443178177
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012898817658424377
      

      outcome:

      passed
      

    Function: test_run_method

    • Test 458

      📌 Setup phase

      duration:

      0.0004040990024805069
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000874130055308342
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00024634692817926407
      

      outcome:

      passed
      

    Function: test_repr_output

    • Test 459

      📌 Setup phase

      duration:

      0.00020202063024044037
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016319286078214645
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013215839862823486
      

      outcome:

      passed
      

    Function: test_source_with_regular_function

    • Test 460

      📌 Setup phase

      duration:

      0.00017710402607917786
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0012508872896432877
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015217438340187073
      

      outcome:

      passed
      

    Function: test_source_error_handling

    • Test 461

      📌 Setup phase

      duration:

      0.0002060532569885254
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0012233871966600418
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001670466735959053
      

      outcome:

      passed
      

    Function: test_as_shortcut_basic

    • Test 462

      📌 Setup phase

      duration:

      0.00029620248824357986
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00020331423729658127
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001383703202009201
      

      outcome:

      passed
      

    Function: test_as_shortcut_with_name

    • Test 463

      📌 Setup phase

      duration:

      0.00020829495042562485
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00017348770052194595
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001379074528813362
      

      outcome:

      passed
      

    Function: test_as_shortcut_factory_pattern

    • Test 464

      📌 Setup phase

      duration:

      0.00018307380378246307
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015234388411045074
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014224927872419357
      

      outcome:

      passed
      

    Function: TestShortcutsSingleton

    • Test 465

      📌 Setup phase

      duration:

      0.00030137691646814346
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013663526624441147
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014503579586744308
      

      outcome:

      passed
      
    • Test 467

      📌 Setup phase

      duration:

      0.00032476428896188736
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00019506365060806274
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001597171649336815
      

      outcome:

      passed
      
    • Test 468

      📌 Setup phase

      duration:

      0.00025930628180503845
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00019280798733234406
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00019909534603357315
      

      outcome:

      passed
      
    • Test 469

      📌 Setup phase

      duration:

      0.00028745830059051514
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00024753622710704803
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015025772154331207
      

      outcome:

      passed
      

    Function: TestFullIntegration

    • Test 470

      📌 Setup phase

      duration:

      0.00042641814798116684
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006450861692428589
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00021414458751678467
      

      outcome:

      passed
      

    Function: test_registry_inheritance

    • Test 472

      📌 Setup phase

      duration:

      0.00025658775120973587
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016541965305805206
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013452954590320587
      

      outcome:

      passed
      
  • 📄 test_utils_snapshot.py

    Function: test_snapshot

    • Test 473
      params: test_input="v1", "Visible", false], ["h1", "Hidden", true, expected=["Visible"], kwargs={}

      📌 Runtime Parameters

      params:
        test_input:
          -       - v1
            - Visible
            - (vide)
          -       - h1
            - Hidden
            - True
        expected:
          - Visible
        kwargs:
      {}
      id: exclude_internals
      

      📌 Setup phase

      duration:

      0.00030356086790561676
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006331456825137138
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017783138900995255
      

      outcome:

      passed
      
    • Test 474
      params: test_input="v1", "Visible", false], ["h1", "Hidden", true, expected=["Visible", "Hidden"], kwargs={"include_internal": true}

      📌 Runtime Parameters

      params:
        test_input:
          -       - v1
            - Visible
            - (vide)
          -       - h1
            - Hidden
            - True
        expected:
          - Visible
          - Hidden
        kwargs:
          include_internal: True
      id: include_internals
      

      📌 Setup phase

      duration:

      0.00029718130826950073
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0004449775442481041
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018484517931938171
      

      outcome:

      passed
      
    • Test 475
      params: test_input=[], expected=[], kwargs={}

      📌 Runtime Parameters

      params:
        test_input:
      []
        expected:
      []
        kwargs:
      {}
      id: empty_case
      

      📌 Setup phase

      duration:

      0.0002826051786541939
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015733297914266586
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017891917377710342
      

      outcome:

      passed
      
    • Test 476
      params: test_input="3", "Charlie"], ["1", "Alpha"], ["2", "Beta", expected=["Alpha", "Beta", "Charlie"], kwargs="{'sort_key': }"

      📌 Runtime Parameters

      params:
        test_input:
          -       - 3
            - Charlie
          -       - 1
            - Alpha
          -       - 2
            - Beta
        expected:
          - Alpha
          - Beta
          - Charlie
        kwargs: {'sort_key': <class 'str'>}
      id: sort_str
      

      📌 Setup phase

      duration:

      0.0002827560529112816
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005573267117142677
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017413124442100525
      

      outcome:

      passed
      
    • Test 477
      params: test_input="z3", "C"], ["a1", "A"], ["m2", "B", expected=["A", "B", "C"], kwargs="{'sort_key': at 0x7fe1c5e314c0>}"

      📌 Runtime Parameters

      params:
        test_input:
          -       - z3
            - C
          -       - a1
            - A
          -       - m2
            - B
        expected:
          - A
          - B
          - C
        kwargs: {'sort_key': <function <lambda> at 0x7fe1c5e314c0>}
      id: sort_id
      

      📌 Setup phase

      duration:

      0.00027483515441417694
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005479846149682999
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00018190685659646988
      

      outcome:

      passed
      
    • Test 478
      params: test_input="3", "Charlie"], ["1", "alpha"], ["2", "Beta", expected=["alpha", "Beta", "Charlie"], kwargs="{'sort_key': at 0x7fe1c5e31550>}"

      📌 Runtime Parameters

      params:
        test_input:
          -       - 3
            - Charlie
          -       - 1
            - alpha
          -       - 2
            - Beta
        expected:
          - alpha
          - Beta
          - Charlie
        kwargs: {'sort_key': <function <lambda> at 0x7fe1c5e31550>}
      id: sort_case_insensitive
      

      📌 Setup phase

      duration:

      0.0003041336312890053
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005601570010185242
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016717985272407532
      

      outcome:

      passed
      
    • Test 479
      params: test_input="1", "A"], ["2", "BB"], ["3", "CCC", expected=["A", "BB", "CCC"], kwargs="{'sort_key': at 0x7fe1c5e315e0>}"

      📌 Runtime Parameters

      params:
        test_input:
          -       - 1
            - A
          -       - 2
            - BB
          -       - 3
            - CCC
        expected:
          - A
          - BB
          - CCC
        kwargs: {'sort_key': <function <lambda> at 0x7fe1c5e315e0>}
      id: sort_length
      

      📌 Setup phase

      duration:

      0.0002769939601421356
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005586808547377586
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017064809799194336
      

      outcome:

      passed
      
    • Test 480
      params: test_input="1", "A"], ["2", "B"], ["3", "C", expected=["C", "B", "A"], kwargs="{'sort_key': at 0x7fe1c5e31670>}"

      📌 Runtime Parameters

      params:
        test_input:
          -       - 1
            - A
          -       - 2
            - B
          -       - 3
            - C
        expected:
          - C
          - B
          - A
        kwargs: {'sort_key': <function <lambda> at 0x7fe1c5e31670>}
      id: sort_reverse
      

      📌 Setup phase

      duration:

      0.00029091909527778625
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006747720763087273
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00017685163766145706
      

      outcome:

      passed
      
  • 📄 test_utils_termtitle.py

    Function: test_terminal_title_with_tmux

    • Test 481

      📌 Setup phase

      duration:

      0.00014475267380475998
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.017037782818078995
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00022524595260620117
      

      outcome:

      passed
      
  • 📄 test_utils_tqdm_mod.py

    Function: test_complete_progress_bar

    • Test 482

      📌 Setup phase

      duration:

      0.00016102101653814316
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.004163309000432491
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012680329382419586
      

      outcome:

      passed
      

    Function: test_set_progress_multiple_points

    • Test 483

      📌 Setup phase

      duration:

      0.00013009272515773773
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.001765526831150055
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012702681124210358
      

      outcome:

      passed
      

    Function: test_format_sizeof_alignment

    • Test 484

      📌 Setup phase

      duration:

      0.0001284005120396614
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000164681114256382
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011124461889266968
      

      outcome:

      passed
      

    Function: test_custom_unit

    • Test 486

      📌 Setup phase

      duration:

      0.00018412712961435318
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0048487503081560135
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011655595153570175
      

      outcome:

      passed
      

    Function: test_clamp_above_total

    • Test 487

      📌 Setup phase

      duration:

      0.00012588314712047577
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0004906700924038887
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013574864715337753
      

      outcome:

      passed
      

    Function: test_clamp_below_zero

    • Test 488

      📌 Setup phase

      duration:

      0.00015372689813375473
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0006235679611563683
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00012270454317331314
      

      outcome:

      passed
      
  • 📄 test_utils_trinary.py

    Function: test_check_trinary_valid_values

    • Test 489

      📌 Setup phase

      duration:

      0.00012758560478687286
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00017370004206895828
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010532978922128677
      

      outcome:

      passed
      

    Function: test_check_trinary_invalid_value

    • Test 490

      📌 Setup phase

      duration:

      0.00011645909398794174
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003923587501049042
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010744109749794006
      

      outcome:

      passed
      

    Function: test_check_trinary_with_custom_allowed_values

    • Test 491

      📌 Setup phase

      duration:

      0.00010779313743114471
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00017730239778757095
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010522734373807907
      

      outcome:

      passed
      
  • 📄 test_utils_typecast.py

    Function: test_downcast_success

    • Test 492

      📌 Setup phase

      duration:

      0.00011706352233886719
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018439162522554398
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010782387107610703
      

      outcome:

      passed
      

    Function: test_upcast_success

    • Test 493

      📌 Setup phase

      duration:

      0.00010545924305915833
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014770310372114182
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010097678750753403
      

      outcome:

      passed
      

    Function: test_downcast_invalid

    • Test 494

      📌 Setup phase

      duration:

      0.0001063058152794838
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0003424203023314476
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00020453892648220062
      

      outcome:

      passed
      

    Function: test_upcast_invalid

    • Test 495

      📌 Setup phase

      duration:

      0.00011459924280643463
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00017978157848119736
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010035745799541473
      

      outcome:

      passed
      

    Function: test_object_identity_preserved

    • Test 496

      📌 Setup phase

      duration:

      0.00010839290916919708
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014230422675609589
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010867789387702942
      

      outcome:

      passed
      

    Function: test_ensure_subclass_valid

    • Test 497

      📌 Setup phase

      duration:

      0.00011117197573184967
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001369928941130638
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.000108376145362854
      

      outcome:

      passed
      

    Function: test_ensure_subclass_invalid

    • Test 498

      📌 Setup phase

      duration:

      0.00010356027632951736
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001659635454416275
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001152772456407547
      

      outcome:

      passed
      

    Function: test_cast_changes_class

    • Test 499

      📌 Setup phase

      duration:

      0.00011476129293441772
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001452527940273285
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00011104438453912735
      

      outcome:

      passed
      

    Function: test_cast_preserves_identity

    • Test 500

      📌 Setup phase

      duration:

      0.0001044170930981636
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013025011867284775
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010910257697105408
      

      outcome:

      passed
      
  • 📄 test_utils_utils.py

    Function: test_singleton_instance

    • Test 501

      📌 Setup phase

      duration:

      0.00012827012687921524
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015947036445140839
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00010409299284219742
      

      outcome:

      passed
      

    Function: test_singleton_identity

    • Test 502

      📌 Setup phase

      duration:

      0.00010989047586917877
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001285383477807045
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      9.940750896930695e-05
      

      outcome:

      passed
      

    Function: test_typename

    • Test 503
      params: obj=null, expected="NoneType"

      📌 Runtime Parameters

      params:
        obj: None
        expected: NoneType
      id: None-NoneType
      

      📌 Setup phase

      duration:

      0.0003109760582447052
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001513008028268814
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014839880168437958
      

      outcome:

      passed
      
    • Test 504
      params: obj=true, expected="bool"

      📌 Runtime Parameters

      params:
        obj: True
        expected: bool
      id: True-bool
      

      📌 Setup phase

      duration:

      0.00023927073925733566
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013513769954442978
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014974363148212433
      

      outcome:

      passed
      
    • Test 505
      params: obj=42, expected="int"

      📌 Runtime Parameters

      params:
        obj: 42
        expected: int
      id: 42-int
      

      📌 Setup phase

      duration:

      0.00022863410413265228
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000136462040245533
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013825111091136932
      

      outcome:

      passed
      
    • Test 506
      params: obj=3.14, expected="float"

      📌 Runtime Parameters

      params:
        obj: 3.14
        expected: float
      id: 3.14-float
      

      📌 Setup phase

      duration:

      0.00021793600171804428
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013252533972263336
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014683883637189865
      

      outcome:

      passed
      
    • Test 507
      params: obj="text", expected="str"

      📌 Runtime Parameters

      params:
        obj: text
        expected: str
      id: text-str
      

      📌 Setup phase

      duration:

      0.00022308621555566788
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001449352130293846
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013725925236940384
      

      outcome:

      passed
      
    • Test 508
      params: obj="{1, 2, 3}", expected="set"

      📌 Runtime Parameters

      params:
        obj: {1, 2, 3}
        expected: set
      id: obj5-set
      

      📌 Setup phase

      duration:

      0.0002145981416106224
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013876613229513168
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013968441635370255
      

      outcome:

      passed
      
    • Test 509
      params: obj=1], [2, 3, expected="list"

      📌 Runtime Parameters

      params:
        obj:
          -       - 1
          -       - 2
            - 3
        expected: list
      id: obj6-list
      

      📌 Setup phase

      duration:

      0.00022766273468732834
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001324787735939026
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001451205462217331
      

      outcome:

      passed
      
    • Test 510
      params: obj=[{"a": [1, 2]}, {"b": [3, 4]}], expected="list"

      📌 Runtime Parameters

      params:
        obj:
          -       a:
              - 1
              - 2
          -       b:
              - 3
              - 4
        expected: list
      id: obj7-list
      

      📌 Setup phase

      duration:

      0.00022271648049354553
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013457145541906357
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013629253953695297
      

      outcome:

      passed
      
    • Test 511
      params: obj={"key": [{"nested": 1}, [2, 3]]}, expected="dict"

      📌 Runtime Parameters

      params:
        obj:
          key:
            -         nested: 1
            -         - 2
              - 3
        expected: dict
      id: obj8-dict
      

      📌 Setup phase

      duration:

      0.0002358006313443184
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014031212776899338
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014412682503461838
      

      outcome:

      passed
      
    • Test 512
      params: obj=" at 0x7fe1c5e07dc0>", expected="function"

      📌 Runtime Parameters

      params:
        obj: <function <lambda> at 0x7fe1c5e07dc0>
        expected: function
      id: <lambda>-function
      

      📌 Setup phase

      duration:

      0.0003211610019207001
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016188155859708786
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014706701040267944
      

      outcome:

      passed
      
    • Test 513
      params: obj="", expected="function"

      📌 Runtime Parameters

      params:
        obj: <function sample_function at 0x7fe1c5e07d30>
        expected: function
      id: sample_function-function
      

      📌 Setup phase

      duration:

      0.00023748353123664856
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018272176384925842
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014898646622896194
      

      outcome:

      passed
      
    • Test 514
      params: obj=".nested at 0x7fe1c5e07e50>", expected="function"

      📌 Runtime Parameters

      params:
        obj: <function sample_function.<locals>.nested at 0x7fe1c5e07e50>
        expected: function
      id: nested-function
      

      📌 Setup phase

      duration:

      0.00022581592202186584
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013558752834796906
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001610890030860901
      

      outcome:

      passed
      
    • Test 515
      params: obj="", expected="builtin_function_or_method"

      📌 Runtime Parameters

      params:
        obj: <built-in function len>
        expected: builtin_function_or_method
      id: len-builtin_function_or_method
      

      📌 Setup phase

      duration:

      0.00023724138736724854
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001386161893606186
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00013986509293317795
      

      outcome:

      passed
      
    • Test 516
      params: obj="", expected="builtin_function_or_method"

      📌 Runtime Parameters

      params:
        obj: <built-in function sum>
        expected: builtin_function_or_method
      id: sum-builtin_function_or_method
      

      📌 Setup phase

      duration:

      0.00022660288959741592
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013952795416116714
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001581711694598198
      

      outcome:

      passed
      
    • Test 517
      params: obj="", expected="module"

      📌 Runtime Parameters

      params:
        obj: <module 'math' from '/workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/lib-dynload/math.cpython-38-x86_64-linux-gnu.so'>
        expected: module
      id: math-module
      

      📌 Setup phase

      duration:

      0.00023117288947105408
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013436656445264816
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015514064580202103
      

      outcome:

      passed
      
    • Test 518
      params: obj="", expected="module"

      📌 Runtime Parameters

      params:
        obj: <module 'sys' (built-in)>
        expected: module
      id: sys-module
      

      📌 Setup phase

      duration:

      0.00022653304040431976
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001363176852464676
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014851335436105728
      

      outcome:

      passed
      
    • Test 519
      params: obj="", expected="type"

      📌 Runtime Parameters

      params:
        obj: <class 'function'>
        expected: type
      id: function-type
      

      📌 Setup phase

      duration:

      0.00022083520889282227
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013808626681566238
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001428462564945221
      

      outcome:

      passed
      
    • Test 520
      params: obj=" at 0x7fe1c5b265f0>", expected="generator"

      📌 Runtime Parameters

      params:
        obj: <generator object <genexpr> at 0x7fe1c5b265f0>
        expected: generator
      id: <genexpr>-generator
      

      📌 Setup phase

      duration:

      0.00022295862436294556
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015008822083473206
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014274287968873978
      

      outcome:

      passed
      
    • Test 521
      params: obj="", expected="list_iterator"

      📌 Runtime Parameters

      params:
        obj: <list_iterator object at 0x7fe1c5b1b880>
        expected: list_iterator
      id: obj18-list_iterator
      

      📌 Setup phase

      duration:

      0.00022695399820804596
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013937056064605713
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014229025691747665
      

      outcome:

      passed
      

    Function: test_next_int

    • Test 522
      params: nums=[1, 2, 3], expected=4

      📌 Runtime Parameters

      params:
        nums:
          - 1
          - 2
          - 3
        expected: 4
      id: nums0-4
      

      📌 Setup phase

      duration:

      0.00023091211915016174
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013905949890613556
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014886539429426193
      

      outcome:

      passed
      
    • Test 523
      params: nums=[10, 20], expected=21

      📌 Runtime Parameters

      params:
        nums:
          - 10
          - 20
        expected: 21
      id: nums1-21
      

      📌 Setup phase

      duration:

      0.0002283155918121338
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013764481991529465
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014881324023008347
      

      outcome:

      passed
      
    • Test 524
      params: nums=[], expected=0

      📌 Runtime Parameters

      params:
        nums:
      []
        expected: 0
      id: nums2-0
      

      📌 Setup phase

      duration:

      0.0002299230545759201
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013851188123226166
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014080293476581573
      

      outcome:

      passed
      

    Function: test_zero_pad

    • Test 525
      params: i=7, n=3, expected="007"

      📌 Runtime Parameters

      params:
        i: 7
        n: 3
        expected: 007
      id: 7-3-007
      

      📌 Setup phase

      duration:

      0.0002594068646430969
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013879872858524323
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015783309936523438
      

      outcome:

      passed
      
    • Test 526
      params: i=123, n=5, expected="00123"

      📌 Runtime Parameters

      params:
        i: 123
        n: 5
        expected: 00123
      id: 123-5-00123
      

      📌 Setup phase

      duration:

      0.00035263318568468094
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000221937894821167
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00024300161749124527
      

      outcome:

      passed
      
    • Test 527
      params: i=0, n=2, expected="00"

      📌 Runtime Parameters

      params:
        i: 0
        n: 2
        expected: 00
      id: 0-2-00
      

      📌 Setup phase

      duration:

      0.0004145931452512741
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014954246580600739
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016333814710378647
      

      outcome:

      passed
      

    Function: test_iround

    • Test 528
      params: val=3.6, expected=4

      📌 Runtime Parameters

      params:
        val: 3.6
        expected: 4
      id: 3.6-4
      

      📌 Setup phase

      duration:

      0.00023206789046525955
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015147961676120758
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015398580580949783
      

      outcome:

      passed
      
    • Test 529
      params: val=2.1, expected=2

      📌 Runtime Parameters

      params:
        val: 2.1
        expected: 2
      id: 2.1-2
      

      📌 Setup phase

      duration:

      0.0002314383164048195
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013716332614421844
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015016552060842514
      

      outcome:

      passed
      
    • Test 530
      params: val=-1.5, expected=-2

      📌 Runtime Parameters

      params:
        val: -1.5
        expected: -2
      id: -1.5--2
      

      📌 Setup phase

      duration:

      0.00022240262478590012
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013971887528896332
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014424510300159454
      

      outcome:

      passed
      
    • Test 531
      params: val=-1.4, expected=-1

      📌 Runtime Parameters

      params:
        val: -1.4
        expected: -1
      id: -1.4--1
      

      📌 Setup phase

      duration:

      0.00023331958800554276
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00013900455087423325
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014216918498277664
      

      outcome:

      passed
      

    Function: test_sorted_naturally

    • Test 532
      params: items=["file1", "file10", "file2"], expected=["file1", "file2", "file10"]

      📌 Runtime Parameters

      params:
        items:
          - file1
          - file10
          - file2
        expected:
          - file1
          - file2
          - file10
      id: items0-expected0
      

      📌 Setup phase

      duration:

      0.00021922681480646133
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00018016714602708817
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014411751180887222
      

      outcome:

      passed
      
    • Test 533
      params: items=["z9", "z10", "z2", "z1"], expected=["z1", "z2", "z9", "z10"]

      📌 Runtime Parameters

      params:
        items:
          - z9
          - z10
          - z2
          - z1
        expected:
          - z1
          - z2
          - z9
          - z10
      id: items1-expected1
      

      📌 Setup phase

      duration:

      0.00023124180734157562
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001615947112441063
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00014342926442623138
      

      outcome:

      passed
      

    Function: test_sorted_naturally_reverse

    • Test 534
      params: items=["file1", "file10", "file2"], expected=["file10", "file2", "file1"]

      📌 Runtime Parameters

      params:
        items:
          - file1
          - file10
          - file2
        expected:
          - file10
          - file2
          - file1
      id: items0-expected0
      

      📌 Setup phase

      duration:

      0.00022659823298454285
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00016860011965036392
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001425398513674736
      

      outcome:

      passed
      
  • 📄 test_utils_xrange.py

    Function: test_xrange_finite

    • Test 535
      params: args=[10], kwargs={}, expected=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

      📌 Runtime Parameters

      params:
        args:
          - 10
        kwargs:
      {}
        expected:
          - (vide)
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
          - 7
          - 8
          - 9
      id: args0-kwargs0-expected0
      

      📌 Setup phase

      duration:

      0.0002860361710190773
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015896279364824295
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00016588252037763596
      

      outcome:

      passed
      
    • Test 536
      params: args=[0, 10], kwargs={}, expected=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

      📌 Runtime Parameters

      params:
        args:
          - (vide)
          - 10
        kwargs:
      {}
        expected:
          - (vide)
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
          - 7
          - 8
          - 9
      id: args1-kwargs1-expected1
      

      📌 Setup phase

      duration:

      0.00027452781796455383
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014129560440778732
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0001820893958210945
      

      outcome:

      passed
      
    • Test 537
      params: args=[0, 10, 2], kwargs={}, expected=[0, 2, 4, 6, 8]

      📌 Runtime Parameters

      params:
        args:
          - (vide)
          - 10
          - 2
        kwargs:
      {}
        expected:
          - (vide)
          - 2
          - 4
          - 6
          - 8
      id: args2-kwargs2-expected2
      

      📌 Setup phase

      duration:

      0.00027253851294517517
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00015048589557409286
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00024989526718854904
      

      outcome:

      passed
      
    • Test 538
      params: args=[10], kwargs={"step": 2}, expected=[0, 2, 4, 6, 8]

      📌 Runtime Parameters

      params:
        args:
          - 10
        kwargs:
          step: 2
        expected:
          - (vide)
          - 2
          - 4
          - 6
          - 8
      id: args3-kwargs3-expected3
      

      📌 Setup phase

      duration:

      0.0002986229956150055
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00014596432447433472
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015704333782196045
      

      outcome:

      passed
      

    Function: test_xrange_infinite

    • Test 539
      params: args=[], kwargs={}, expected_repr="count(0)"

      📌 Runtime Parameters

      params:
        args:
      []
        kwargs:
      {}
        expected_repr: count(0)
      id: args0-kwargs0-count(0)
      

      📌 Setup phase

      duration:

      0.000263310968875885
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001527387648820877
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015718862414360046
      

      outcome:

      passed
      
    • Test 540
      params: args=[], kwargs={"step": 2}, expected_repr="count(0, 2)"

      📌 Runtime Parameters

      params:
        args:
      []
        kwargs:
          step: 2
        expected_repr: count(0, 2)
      id: args1-kwargs1-count(0, 2)
      

      📌 Setup phase

      duration:

      0.00027499347925186157
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0001652836799621582
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.00015809666365385056
      

      outcome:

      passed
      

    Function: test_xrange_too_many_args

    • Test 541
      params: args=[1, 2, 3, 4]

      📌 Runtime Parameters

      params:
        args:
          - 1
          - 2
          - 3
          - 4
      id: args0
      

      📌 Setup phase

      duration:

      0.00017710216343402863
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0004463391378521919
      

      outcome:

      passed
      

      📌 Teardown phase

      duration:

      0.0008048564195632935
      

      outcome:

      passed
      
Failed (17)
  • 📄 test_utils_debug.py

    Function: test_short_repr

    • Test 141
      params: value="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", cutoff=10, expected="'aaaaaaaaaa..."

      📌 Runtime Parameters

      params:
        value: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        cutoff: 10
        expected: 'aaaaaaaaaa...
      id: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-10-'aaaaaaaaaa...
      

      📌 Setup phase

      duration:

      0.0002837693318724632
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0008617574349045753
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_debug.py
      lineno: 66
      message: assert "'aaaaaaaaa..." == "'aaaaaaaaaa..."
      
        - 'aaaaaaaaaa...
        ?  -
        + 'aaaaaaaaa...
      

      traceback:

      -   path: tests/test_utils_debug.py
        lineno: 66
        message: AssertionError
      

      longrepr:

      value = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
      cutoff = 10, expected = "'aaaaaaaaaa..."
      
          @pytest.mark.parametrize(
              "value, cutoff, expected",
              [
                  ("abc", 10, "'abc'"),
                  ("a" * 100, 10, "'aaaaaaaaaa..."),
                  (12345, 10, "12345"),
                  ([0]*100, 15, str(repr([0]*100))[:15] + "..."),
                  (None, 10, "None"),
                  (type("Obj", (), {"__repr__": lambda self: "Obj(" + "x"*50 + ")"})(), 20, "Obj(xxxxxxxxxxxxxxxxx..."),
              ]
          )
      
          def test_short_repr(value, cutoff, expected):
      >       assert short_repr(value, cutoff) == expected
      E       assert "'aaaaaaaaa..." == "'aaaaaaaaaa..."
      E         
      E         - 'aaaaaaaaaa...
      E         ?  -
      E         + 'aaaaaaaaa...
      
      tests/test_utils_debug.py:66: AssertionError
      

      📌 Teardown phase

      duration:

      0.0002796994522213936
      

      outcome:

      passed
      
    • Test 145
      params: value="Obj(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)", cutoff=20, expected="Obj(xxxxxxxxxxxxxxxxx..."

      📌 Runtime Parameters

      params:
        value: Obj(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
        cutoff: 20
        expected: Obj(xxxxxxxxxxxxxxxxx...
      id: value5-20-Obj(xxxxxxxxxxxxxxxxx...
      

      📌 Setup phase

      duration:

      0.00027256645262241364
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005583036690950394
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_debug.py
      lineno: 66
      message: AssertionError: assert 'Obj(xxxxxxxxxxxxxxxx...' == 'Obj(xxxxxxxxxxxxxxxxx...'
      
        - Obj(xxxxxxxxxxxxxxxxx...
        ?                     -
        + Obj(xxxxxxxxxxxxxxxx...
      

      traceback:

      -   path: tests/test_utils_debug.py
        lineno: 66
        message: AssertionError
      

      longrepr:

      value = Obj(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx), cutoff = 20
      expected = 'Obj(xxxxxxxxxxxxxxxxx...'
      
          @pytest.mark.parametrize(
              "value, cutoff, expected",
              [
                  ("abc", 10, "'abc'"),
                  ("a" * 100, 10, "'aaaaaaaaaa..."),
                  (12345, 10, "12345"),
                  ([0]*100, 15, str(repr([0]*100))[:15] + "..."),
                  (None, 10, "None"),
                  (type("Obj", (), {"__repr__": lambda self: "Obj(" + "x"*50 + ")"})(), 20, "Obj(xxxxxxxxxxxxxxxxx..."),
              ]
          )
      
          def test_short_repr(value, cutoff, expected):
      >       assert short_repr(value, cutoff) == expected
      E       AssertionError: assert 'Obj(xxxxxxxxxxxxxxxx...' == 'Obj(xxxxxxxxxxxxxxxxx...'
      E         
      E         - Obj(xxxxxxxxxxxxxxxxx...
      E         ?                     -
      E         + Obj(xxxxxxxxxxxxxxxx...
      
      tests/test_utils_debug.py:66: AssertionError
      

      📌 Teardown phase

      duration:

      0.0002031354233622551
      

      outcome:

      passed
      
  • 📄 test_utils_elog.py

    Function: test_get_default_elog_instance_with_direct_password_and_real_check

    • Test 177

      📌 Setup phase

      duration:

      0.00011102110147476196
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.010442880913615227
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_elog.py
      lineno: 24
      message: Failed: elog.post() raised an unexpected exception: No response from the logbook server.
      Details: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4ec2550>: Failed to establish a new connection: [Errno 111] Connection refused'))
      

      traceback:

      -   path: tests/test_utils_elog.py
        lineno: 24
        message: Failed
      

      longrepr:

      self = <urllib3.connection.HTTPConnection object at 0x7fe1c4edaca0>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
      >           sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:199: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:85: in create_connection
          raise err
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      address = ('localhost', 8080), timeout = None, source_address = None
      socket_options = [(6, 1, 1)]
      
          def create_connection(
              address: tuple[str, int],
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              source_address: tuple[str, int] | None = None,
              socket_options: _TYPE_SOCKET_OPTIONS | None = None,
          ) -> socket.socket:
              """Connect to *address* and return the socket object.
      
              Convenience function.  Connect to *address* (a 2-tuple ``(host,
              port)``) and return the socket object.  Passing the optional
              *timeout* parameter will set the timeout on the socket instance
              before attempting to connect.  If no *timeout* is supplied, the
              global default timeout setting returned by :func:`socket.getdefaulttimeout`
              is used.  If *source_address* is set it must be a tuple of (host, port)
              for the socket to bind as a source address before making the connection.
              An host of '' or port 0 tells the OS to use the default.
              """
      
              host, port = address
              if host.startswith("["):
                  host = host.strip("[]")
              err = None
      
              # Using the value from allowed_gai_family() in the context of getaddrinfo lets
              # us select whether to work with IPv4 DNS records, IPv6 records, or both.
              # The original create_connection function always returns all records.
              family = allowed_gai_family()
      
              try:
                  host.encode("idna")
              except UnicodeError:
                  raise LocationParseError(f"'{host}', label empty or too long") from None
      
              for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
                  af, socktype, proto, canonname, sa = res
                  sock = None
                  try:
                      sock = socket.socket(af, socktype, proto)
      
                      # If provided, set socket level options before connecting.
                      _set_socket_options(sock, socket_options)
      
                      if timeout is not _DEFAULT_TIMEOUT:
                          sock.settimeout(timeout)
                      if source_address:
                          sock.bind(source_address)
      >               sock.connect(sa)
      E               ConnectionRefusedError: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:73: ConnectionRefusedError
      
      The above exception was the direct cause of the following exception:
      
      self = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c4eda490>
      method = 'POST', url = '/demo/'
      body = b'--b31e7b72405af3b2b011b6a4a4bce19b\r\nContent-Disposition: form-data; name="Author"\r\n\r\nrobot\r\n--b31e7b72405af3...Disposition: form-data; name="Text"; filename=""\r\n\r\nThis is a message1\r\n--b31e7b72405af3b2b011b6a4a4bce19b--\r\n'
      headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '736', 'Content-Type': 'multipart/form-data; boundary=b31e7b72405af3b2b011b6a4a4bce19b'}
      retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      redirect = False, assert_same_host = False
      timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
      release_conn = False, chunked = False, body_pos = None, preload_content = False
      decode_content = False, response_kw = {}
      parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/demo/', query=None, fragment=None)
      destination_scheme = None, conn = None, release_this_conn = True
      http_tunnel_required = False, err = None, clean_exit = False
      
          def urlopen(  # type: ignore[override]
              self,
              method: str,
              url: str,
              body: _TYPE_BODY | None = None,
              headers: typing.Mapping[str, str] | None = None,
              retries: Retry | bool | int | None = None,
              redirect: bool = True,
              assert_same_host: bool = True,
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              pool_timeout: int | None = None,
              release_conn: bool | None = None,
              chunked: bool = False,
              body_pos: _TYPE_BODY_POSITION | None = None,
              preload_content: bool = True,
              decode_content: bool = True,
              **response_kw: typing.Any,
          ) -> BaseHTTPResponse:
              """
              Get a connection from the pool and perform an HTTP request. This is the
              lowest level call for making a request, so you'll need to specify all
              the raw details.
      
              .. note::
      
                 More commonly, it's appropriate to use a convenience method
                 such as :meth:`request`.
      
              .. note::
      
                 `release_conn` will only behave as expected if
                 `preload_content=False` because we want to make
                 `preload_content=False` the default behaviour someday soon without
                 breaking backwards compatibility.
      
              :param method:
                  HTTP request method (such as GET, POST, PUT, etc.)
      
              :param url:
                  The URL to perform the request on.
      
              :param body:
                  Data to send in the request body, either :class:`str`, :class:`bytes`,
                  an iterable of :class:`str`/:class:`bytes`, or a file-like object.
      
              :param headers:
                  Dictionary of custom headers to send, such as User-Agent,
                  If-None-Match, etc. If None, pool headers are used. If provided,
                  these headers completely replace any pool-specific headers.
      
              :param retries:
                  Configure the number of retries to allow before raising a
                  :class:`~urllib3.exceptions.MaxRetryError` exception.
      
                  If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
                  :class:`~urllib3.util.retry.Retry` object for fine-grained control
                  over different types of retries.
                  Pass an integer number to retry connection errors that many times,
                  but no other types of errors. Pass zero to never retry.
      
                  If ``False``, then retries are disabled and any exception is raised
                  immediately. Also, instead of raising a MaxRetryError on redirects,
                  the redirect response will be returned.
      
              :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
      
              :param redirect:
                  If True, automatically handle redirects (status codes 301, 302,
                  303, 307, 308). Each redirect counts as a retry. Disabling retries
                  will disable redirect, too.
      
              :param assert_same_host:
                  If ``True``, will make sure that the host of the pool requests is
                  consistent else will raise HostChangedError. When ``False``, you can
                  use the pool on an HTTP proxy and request foreign hosts.
      
              :param timeout:
                  If specified, overrides the default timeout for this one
                  request. It may be a float (in seconds) or an instance of
                  :class:`urllib3.util.Timeout`.
      
              :param pool_timeout:
                  If set and the pool is set to block=True, then this method will
                  block for ``pool_timeout`` seconds and raise EmptyPoolError if no
                  connection is available within the time period.
      
              :param bool preload_content:
                  If True, the response's body will be preloaded into memory.
      
              :param bool decode_content:
                  If True, will attempt to decode the body based on the
                  'content-encoding' header.
      
              :param release_conn:
                  If False, then the urlopen call will not release the connection
                  back into the pool once a response is received (but will release if
                  you read the entire contents of the response such as when
                  `preload_content=True`). This is useful if you're not preloading
                  the response's content immediately. You will need to call
                  ``r.release_conn()`` on the response ``r`` to return the connection
                  back into the pool. If None, it takes the value of ``preload_content``
                  which defaults to ``True``.
      
              :param bool chunked:
                  If True, urllib3 will send the body using chunked transfer
                  encoding. Otherwise, urllib3 will send the body using the standard
                  content-length form. Defaults to False.
      
              :param int body_pos:
                  Position to seek to in file-like body in the event of a retry or
                  redirect. Typically this won't need to be set because urllib3 will
                  auto-populate the value when needed.
              """
              parsed_url = parse_url(url)
              destination_scheme = parsed_url.scheme
      
              if headers is None:
                  headers = self.headers
      
              if not isinstance(retries, Retry):
                  retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
      
              if release_conn is None:
                  release_conn = preload_content
      
              # Check host
              if assert_same_host and not self.is_same_host(url):
                  raise HostChangedError(self, url, retries)
      
              # Ensure that the URL we're connecting to is properly encoded
              if url.startswith("/"):
                  url = to_str(_encode_target(url))
              else:
                  url = to_str(parsed_url.url)
      
              conn = None
      
              # Track whether `conn` needs to be released before
              # returning/raising/recursing. Update this variable if necessary, and
              # leave `release_conn` constant throughout the function. That way, if
              # the function recurses, the original value of `release_conn` will be
              # passed down into the recursive call, and its value will be respected.
              #
              # See issue #651 [1] for details.
              #
              # [1] <https://github.com/urllib3/urllib3/issues/651>
              release_this_conn = release_conn
      
              http_tunnel_required = connection_requires_http_tunnel(
                  self.proxy, self.proxy_config, destination_scheme
              )
      
              # Merge the proxy headers. Only done when not using HTTP CONNECT. We
              # have to copy the headers dict so we can safely change it without those
              # changes being reflected in anyone else's copy.
              if not http_tunnel_required:
                  headers = headers.copy()  # type: ignore[attr-defined]
                  headers.update(self.proxy_headers)  # type: ignore[union-attr]
      
              # Must keep the exception bound to a separate variable or else Python 3
              # complains about UnboundLocalError.
              err = None
      
              # Keep track of whether we cleanly exited the except block. This
              # ensures we do proper cleanup in finally.
              clean_exit = False
      
              # Rewind body position, if needed. Record current position
              # for future rewinds in the event of a redirect/retry.
              body_pos = set_file_position(body, body_pos)
      
              try:
                  # Request a connection from the queue.
                  timeout_obj = self._get_timeout(timeout)
                  conn = self._get_conn(timeout=pool_timeout)
      
                  conn.timeout = timeout_obj.connect_timeout  # type: ignore[assignment]
      
                  # Is this a closed/new connection that requires CONNECT tunnelling?
                  if self.proxy is not None and http_tunnel_required and conn.is_closed:
                      try:
                          self._prepare_proxy(conn)
                      except (BaseSSLError, OSError, SocketTimeout) as e:
                          self._raise_timeout(
                              err=e, url=self.proxy.url, timeout_value=conn.timeout
                          )
                          raise
      
                  # If we're going to release the connection in ``finally:``, then
                  # the response doesn't need to know about the connection. Otherwise
                  # it will also try to release it and we'll have a double-release
                  # mess.
                  response_conn = conn if not release_conn else None
      
                  # Make the request on the HTTPConnection object
      >           response = self._make_request(
                      conn,
                      method,
                      url,
                      timeout=timeout_obj,
                      body=body,
                      headers=headers,
                      chunked=chunked,
                      retries=retries,
                      response_conn=response_conn,
                      preload_content=preload_content,
                      decode_content=decode_content,
                      **response_kw,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:789: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:495: in _make_request
          conn.request(
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:441: in request
          self.endheaders()
      .pixi/envs/default/lib/python3.8/http/client.py:1251: in endheaders
          self._send_output(message_body, encode_chunked=encode_chunked)
      .pixi/envs/default/lib/python3.8/http/client.py:1011: in _send_output
          self.send(msg)
      .pixi/envs/default/lib/python3.8/http/client.py:951: in send
          self.connect()
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:279: in connect
          self.sock = self._new_conn()
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <urllib3.connection.HTTPConnection object at 0x7fe1c4edaca0>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
                  sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
              except socket.gaierror as e:
                  raise NameResolutionError(self.host, self, e) from e
              except SocketTimeout as e:
                  raise ConnectTimeoutError(
                      self,
                      f"Connection to {self.host} timed out. (connect timeout={self.timeout})",
                  ) from e
      
              except OSError as e:
      >           raise NewConnectionError(
                      self, f"Failed to establish a new connection: {e}"
                  ) from e
      E           urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7fe1c4edaca0>: Failed to establish a new connection: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:214: NewConnectionError
      
      The above exception was the direct cause of the following exception:
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c4eda700>
      request = <PreparedRequest [POST]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
      >           resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:667: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:843: in urlopen
          retries = retries.increment(
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      method = 'POST', url = '/demo/', response = None
      error = NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4edaca0>: Failed to establish a new connection: [Errno 111] Connection refused')
      _pool = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c4eda490>
      _stacktrace = <traceback object at 0x7fe1c4f55dc0>
      
          def increment(
              self,
              method: str | None = None,
              url: str | None = None,
              response: BaseHTTPResponse | None = None,
              error: Exception | None = None,
              _pool: ConnectionPool | None = None,
              _stacktrace: TracebackType | None = None,
          ) -> Self:
              """Return a new Retry object with incremented retry counters.
      
              :param response: A response object, or None, if the server did not
                  return a response.
              :type response: :class:`~urllib3.response.BaseHTTPResponse`
              :param Exception error: An error encountered during the request, or
                  None if the response was received successfully.
      
              :return: A new ``Retry`` object.
              """
              if self.total is False and error:
                  # Disabled, indicate to re-raise the error.
                  raise reraise(type(error), error, _stacktrace)
      
              total = self.total
              if total is not None:
                  total -= 1
      
              connect = self.connect
              read = self.read
              redirect = self.redirect
              status_count = self.status
              other = self.other
              cause = "unknown"
              status = None
              redirect_location = None
      
              if error and self._is_connection_error(error):
                  # Connect retry?
                  if connect is False:
                      raise reraise(type(error), error, _stacktrace)
                  elif connect is not None:
                      connect -= 1
      
              elif error and self._is_read_error(error):
                  # Read retry?
                  if read is False or method is None or not self._is_method_retryable(method):
                      raise reraise(type(error), error, _stacktrace)
                  elif read is not None:
                      read -= 1
      
              elif error:
                  # Other retry?
                  if other is not None:
                      other -= 1
      
              elif response and response.get_redirect_location():
                  # Redirect retry?
                  if redirect is not None:
                      redirect -= 1
                  cause = "too many redirects"
                  response_redirect_location = response.get_redirect_location()
                  if response_redirect_location:
                      redirect_location = response_redirect_location
                  status = response.status
      
              else:
                  # Incrementing because of a server error like a 500 in
                  # status_forcelist and the given method is in the allowed_methods
                  cause = ResponseError.GENERIC_ERROR
                  if response and response.status:
                      if status_count is not None:
                          status_count -= 1
                      cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status)
                      status = response.status
      
              history = self.history + (
                  RequestHistory(method, url, error, status, redirect_location),
              )
      
              new_retry = self.new(
                  total=total,
                  connect=connect,
                  read=read,
                  redirect=redirect,
                  status=status_count,
                  other=other,
                  history=history,
              )
      
              if new_retry.is_exhausted():
                  reason = error or ResponseError(cause)
      >           raise MaxRetryError(_pool, url, reason) from reason  # type: ignore[arg-type]
      E           urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4edaca0>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/retry.py:519: MaxRetryError
      
      During handling of the above exception, another exception occurred:
      
      self = <elog.logbook.Logbook object at 0x7fe1c4edaf40>
      message = 'This is a message1', msg_id = None, reply = False
      attributes = {'Author': 'robot', 'When': 1756165750, 'cmd': 'Submit', 'exp': 'demo', ...}
      attachments = [], suppress_email_notification = False, encoding = None
      timeout = None, kwargs = {'Author': 'robot'}
      new_attachment_list = [('Text', ('', b'This is a message1'))]
      objects_to_close = []
      attributes_to_edit = {'Author': b'robot', 'When': 1756165750, 'cmd': b'Submit', 'exp': b'demo', ...}
      
          def post(self, message, msg_id=None, reply=False, attributes=None, attachments=None,
                   suppress_email_notification=False, encoding=None, timeout=None, **kwargs):
              """
              Posts message to the logbook. If msg_id is not specified new message will be created, otherwise existing
              message will be edited, or a reply (if reply=True) to it will be created. This method returns the msg_id
              of the newly created message.
      
              :param message: string with message text
              :param msg_id: ID number of message to edit or reply. If not specified new message is created.
              :param reply: If 'True' reply to existing message is created instead of editing it
              :param attributes: Dictionary of attributes. Following attributes are used internally by the elog and will be
                                 ignored: Text, Date, Encoding, Reply to, In reply to, Locked by, Attachment
              :param attachments: list of:
                                        - file like objects which read() will return bytes (if file_like_object.name is not
                                          defined, default name "attachment<i>" will be used.
                                        - paths to the files
                                  All items will be appended as attachment to the elog entry. In case of unknown
                                  attachment an exception LogbookInvalidAttachment will be raised.
              :param suppress_email_notification: If set to True or 1, E-Mail notification will be suppressed, defaults to False.
              :param encoding: Defines encoding of the message. Can be: 'plain' -> plain text, 'html'->html-text,
                               'ELCode' --> elog formatting syntax
              :param timeout: Define the timeout to be used by the post request. Its value is directly passed to the requests
                              post. Use None to disable the request timeout.
              :param kwargs: Anything in the kwargs will be interpreted as attribute. e.g.: logbook.post('Test text',
                             Author='Rok Vintar), "Author" will be sent as an attribute. If named same as one of the
                             attributes defined in "attributes", kwargs will have priority.
      
              :return: msg_id
              """
      
              attributes = attributes or {}
              attributes = {**attributes, **kwargs}  # kwargs as attributes with higher priority
      
              attachments = attachments or []
      
              if encoding is not None:
                  if encoding not in ['plain', 'HTML', 'ELCode']:
                      raise LogbookMessageRejected('Invalid message encoding. Valid options: plain, HTML, ELCode.')
                  attributes['Encoding'] = encoding
      
              if suppress_email_notification:
                  attributes["suppress"] = 1
      
              # THE ATTACHMENT STRATEGY WHEN DEALING WITH POST MODIFICATION
              #
              # 1. Does the message on the server have already attachments?
              #    1.1 - We read the message getting the existing attachment list.
              #    1.2 - Add to the attributes dictionary one line for each attachment like this:
              #       attributes['attachmentN'] = timestamped_filename_name
              #
              # 2. Do we have new attachments?
              #    2.1 - Those are in the new_attachment_list. This is a list of this type:
              #       [ ('attfileN', ('filename', fileobject)) ]
              #    2.2 - We need to loop over all the new attachments:
              #       2.2.1 - Does a file already on the server with the same name exist?
              #         2.2.1.1 - No: OK. Then we go ahead with the next attachment.
              #         2.2.1.2 - Yes:
              #           2.2.1.2.1 - Are the two files identical?
              #               2.2.1.2.1.1 - Yes: then we remove this current entry from the new_attachment_list and we leave the one
              #                      already on server.
              #               2.2.1.2.1.2 - No:
              #                  2.2.1.2.1.2.1 - Then the file has been update.
              #                  2.2.1.2.1.2.2 - We need to remove the file on server first (using special post)
              #                  2.2.1.2.1.2.3 - We have to remove the old attachment from the attributes dictionary.
              #
      
              if attachments:
                  # here we accomplish point 2.1.
                  # new_attachment_list is something like [ ('attfileN', ('filename', fileobject)) ]
                  new_attachment_list, objects_to_close = self._prepare_attachments(attachments)
              else:
                  objects_to_close = list()
                  new_attachment_list = list()
      
              attributes_to_edit = dict()
              if msg_id:
                  # Message exists, we can continue
                  if reply:
                      # Verify that there is a message on the server, otherwise do not reply to it!
                      self._check_if_message_on_server(msg_id)  # raises exception in case of none existing message
                      attributes['reply_to'] = str(msg_id)
                  else:  # Edit existing
                      attributes['edit_id'] = str(msg_id)
                      attributes['skiplock'] = '1'
      
                      # here we accomplish point 1.1.
                      # existing_attachments_list is something like:
                      # [ 'https://elog.url.com/logbook/timestamped_filename' ]
                      msg_to_edit, attributes_to_edit, existing_attachments_list = self.read(msg_id)
      
                      for attribute, data in attributes.items():
                          new_data = attributes.get(attribute)
                          if new_data is not None:
                              attributes_to_edit[attribute] = new_data
      
                      i = 0
                      existing_attachments_filename_list = list()
                      for attachment in existing_attachments_list:
                          # here we accomplish point 1.2. We strip the timestamped_filename from the whole URL.
                          attributes_to_edit[f'attachment{i}'] = os.path.basename(attachment)
                          existing_attachments_filename_list.append(os.path.basename(attachment)[14:])
                          i += 1
      
                      # let's accomplish 2.2. Loop over all new attachment
                      duplicate_attachment_list = list()
                      for new_attachment in new_attachment_list:
                          # the new_attachment_list is something like:
                          # [ ('attfileN', ('filename', fileobject)) ]
                          new_attachment_filename = new_attachment[1][0]
                          if new_attachment_filename in existing_attachments_filename_list:
                              # a file with the same name existing already on the server.
                              # we need to check if the two files are the same.
                              # read the content of the new file
                              new_attachment_content = new_attachment[1][1].read()
                              # don't forget to reset the fileobj to the beginning of the file
                              new_attachment[1][1].seek(0)
                              # get the existing attachment content
                              attachment_index = existing_attachments_filename_list.index(new_attachment_filename)
                              existing_attachment_content = self.download_attachment(
                                  url=existing_attachments_list[attachment_index],
                                  timeout=timeout
                              )
                              # check if the two contents are the same
                              if new_attachment_content == existing_attachment_content:
                                  # yes. then we don't upload a second copy. we remove the current entry from the list
                                  duplicate_attachment_list.append(new_attachment)
                              else:
                                  # no. they are not the same file. we will replace the existing file with the new one
                                  # first: we need to remove the attachment from the server using the dedicated method
                                  self.delete_attachment(msg_id, attributes=attributes_to_edit,
                                                         attachment_id=attachment_index,
                                                         timeout=timeout, text=msg_to_edit)
                                  # now we can remove this attachment from the auxiliary lists.
                                  existing_attachments_filename_list.pop(attachment_index)
                                  existing_attachments_list.pop(attachment_index)
                                  # now we need to rebuild the attributes dictionary for the part concerning the attachments.
                                  # we remove all of them first
                                  keys_to_be_removed = list()
                                  for key in attributes_to_edit.keys():
                                      if key.startswith('attachment'):
                                          keys_to_be_removed.append(key)
                                      if key.startswith('delatt'):
                                          keys_to_be_removed.append(key)
                                  for key in keys_to_be_removed:
                                      del attributes_to_edit[key]
      
                                  # now we rebuild it
                                  for i, attachment in enumerate(existing_attachments_list):
                                      attributes_to_edit[f'attachment{i}'] = os.path.basename(attachment)
      
                      # remove all duplicate attachments from the new_attachment_list
                      for attach in duplicate_attachment_list:
                          new_attachment_list.remove(attach)
      
              else:
                  # As we create a new message, specify creation time if not already specified in attributes
                  if 'When' not in attributes:
                      attributes['When'] = int(datetime.now().timestamp())
      
              if not attributes_to_edit:
                  attributes_to_edit = attributes
      
              # Remove any attributes that should not be sent
              _remove_reserved_attributes(attributes_to_edit)
      
              # Make requests module think that Text is a "file". This is the only way to force requests to send data as
              # multipart/form-data even if there are no attachments. Elog understands only multipart/form-data
              new_attachment_list.append(('Text', ('', message.encode('iso-8859-1'))))
      
              # Base attributes are common to all messages
              self._add_base_msg_attributes(attributes_to_edit)
      
              # Keys in attributes cannot have certain characters like whitespaces or dashes for the http request
              attributes_to_edit = _replace_special_characters_in_attribute_keys(attributes_to_edit)
      
              # All string values in the attributes must be encoded in latin1
              attributes_to_edit = _encode_values(attributes_to_edit)
      
              try:
      >           response = requests.post(self._url, data=attributes_to_edit, files=new_attachment_list,
                                           allow_redirects=False, verify=False, timeout=timeout)
      
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:288: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:115: in post
          return request("post", url, data=data, json=json, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:59: in request
          return session.request(method=method, url=url, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:589: in request
          resp = self.send(prep, **send_kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:703: in send
          r = adapter.send(request, **kwargs)
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c4eda700>
      request = <PreparedRequest [POST]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
                  resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
              except (ProtocolError, OSError) as err:
                  raise ConnectionError(err, request=request)
      
              except MaxRetryError as e:
                  if isinstance(e.reason, ConnectTimeoutError):
                      # TODO: Remove this in 3.0.0: see #2811
                      if not isinstance(e.reason, NewConnectionError):
                          raise ConnectTimeout(e, request=request)
      
                  if isinstance(e.reason, ResponseError):
                      raise RetryError(e, request=request)
      
                  if isinstance(e.reason, _ProxyError):
                      raise ProxyError(e, request=request)
      
                  if isinstance(e.reason, _SSLError):
                      # This branch is for urllib3 v1.22 and later.
                      raise SSLError(e, request=request)
      
      >           raise ConnectionError(e, request=request)
      E           requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4edaca0>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:700: ConnectionError
      
      During handling of the above exception, another exception occurred:
      
      self = <urllib3.connection.HTTPConnection object at 0x7fe1c4ec2550>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
      >           sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:199: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:85: in create_connection
          raise err
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      address = ('localhost', 8080), timeout = None, source_address = None
      socket_options = [(6, 1, 1)]
      
          def create_connection(
              address: tuple[str, int],
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              source_address: tuple[str, int] | None = None,
              socket_options: _TYPE_SOCKET_OPTIONS | None = None,
          ) -> socket.socket:
              """Connect to *address* and return the socket object.
      
              Convenience function.  Connect to *address* (a 2-tuple ``(host,
              port)``) and return the socket object.  Passing the optional
              *timeout* parameter will set the timeout on the socket instance
              before attempting to connect.  If no *timeout* is supplied, the
              global default timeout setting returned by :func:`socket.getdefaulttimeout`
              is used.  If *source_address* is set it must be a tuple of (host, port)
              for the socket to bind as a source address before making the connection.
              An host of '' or port 0 tells the OS to use the default.
              """
      
              host, port = address
              if host.startswith("["):
                  host = host.strip("[]")
              err = None
      
              # Using the value from allowed_gai_family() in the context of getaddrinfo lets
              # us select whether to work with IPv4 DNS records, IPv6 records, or both.
              # The original create_connection function always returns all records.
              family = allowed_gai_family()
      
              try:
                  host.encode("idna")
              except UnicodeError:
                  raise LocationParseError(f"'{host}', label empty or too long") from None
      
              for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
                  af, socktype, proto, canonname, sa = res
                  sock = None
                  try:
                      sock = socket.socket(af, socktype, proto)
      
                      # If provided, set socket level options before connecting.
                      _set_socket_options(sock, socket_options)
      
                      if timeout is not _DEFAULT_TIMEOUT:
                          sock.settimeout(timeout)
                      if source_address:
                          sock.bind(source_address)
      >               sock.connect(sa)
      E               ConnectionRefusedError: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:73: ConnectionRefusedError
      
      The above exception was the direct cause of the following exception:
      
      self = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c4ec2a00>
      method = 'GET', url = '/demo/None', body = None
      headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'unm=robot;upwd=me1T.2jUUqQNa1wNuey9zNBOmOa4eILOaPb.ZSZjpn4;'}
      retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      redirect = False, assert_same_host = False
      timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
      release_conn = False, chunked = False, body_pos = None, preload_content = False
      decode_content = False, response_kw = {}
      parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/demo/None', query=None, fragment=None)
      destination_scheme = None, conn = None, release_this_conn = True
      http_tunnel_required = False, err = None, clean_exit = False
      
          def urlopen(  # type: ignore[override]
              self,
              method: str,
              url: str,
              body: _TYPE_BODY | None = None,
              headers: typing.Mapping[str, str] | None = None,
              retries: Retry | bool | int | None = None,
              redirect: bool = True,
              assert_same_host: bool = True,
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              pool_timeout: int | None = None,
              release_conn: bool | None = None,
              chunked: bool = False,
              body_pos: _TYPE_BODY_POSITION | None = None,
              preload_content: bool = True,
              decode_content: bool = True,
              **response_kw: typing.Any,
          ) -> BaseHTTPResponse:
              """
              Get a connection from the pool and perform an HTTP request. This is the
              lowest level call for making a request, so you'll need to specify all
              the raw details.
      
              .. note::
      
                 More commonly, it's appropriate to use a convenience method
                 such as :meth:`request`.
      
              .. note::
      
                 `release_conn` will only behave as expected if
                 `preload_content=False` because we want to make
                 `preload_content=False` the default behaviour someday soon without
                 breaking backwards compatibility.
      
              :param method:
                  HTTP request method (such as GET, POST, PUT, etc.)
      
              :param url:
                  The URL to perform the request on.
      
              :param body:
                  Data to send in the request body, either :class:`str`, :class:`bytes`,
                  an iterable of :class:`str`/:class:`bytes`, or a file-like object.
      
              :param headers:
                  Dictionary of custom headers to send, such as User-Agent,
                  If-None-Match, etc. If None, pool headers are used. If provided,
                  these headers completely replace any pool-specific headers.
      
              :param retries:
                  Configure the number of retries to allow before raising a
                  :class:`~urllib3.exceptions.MaxRetryError` exception.
      
                  If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
                  :class:`~urllib3.util.retry.Retry` object for fine-grained control
                  over different types of retries.
                  Pass an integer number to retry connection errors that many times,
                  but no other types of errors. Pass zero to never retry.
      
                  If ``False``, then retries are disabled and any exception is raised
                  immediately. Also, instead of raising a MaxRetryError on redirects,
                  the redirect response will be returned.
      
              :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
      
              :param redirect:
                  If True, automatically handle redirects (status codes 301, 302,
                  303, 307, 308). Each redirect counts as a retry. Disabling retries
                  will disable redirect, too.
      
              :param assert_same_host:
                  If ``True``, will make sure that the host of the pool requests is
                  consistent else will raise HostChangedError. When ``False``, you can
                  use the pool on an HTTP proxy and request foreign hosts.
      
              :param timeout:
                  If specified, overrides the default timeout for this one
                  request. It may be a float (in seconds) or an instance of
                  :class:`urllib3.util.Timeout`.
      
              :param pool_timeout:
                  If set and the pool is set to block=True, then this method will
                  block for ``pool_timeout`` seconds and raise EmptyPoolError if no
                  connection is available within the time period.
      
              :param bool preload_content:
                  If True, the response's body will be preloaded into memory.
      
              :param bool decode_content:
                  If True, will attempt to decode the body based on the
                  'content-encoding' header.
      
              :param release_conn:
                  If False, then the urlopen call will not release the connection
                  back into the pool once a response is received (but will release if
                  you read the entire contents of the response such as when
                  `preload_content=True`). This is useful if you're not preloading
                  the response's content immediately. You will need to call
                  ``r.release_conn()`` on the response ``r`` to return the connection
                  back into the pool. If None, it takes the value of ``preload_content``
                  which defaults to ``True``.
      
              :param bool chunked:
                  If True, urllib3 will send the body using chunked transfer
                  encoding. Otherwise, urllib3 will send the body using the standard
                  content-length form. Defaults to False.
      
              :param int body_pos:
                  Position to seek to in file-like body in the event of a retry or
                  redirect. Typically this won't need to be set because urllib3 will
                  auto-populate the value when needed.
              """
              parsed_url = parse_url(url)
              destination_scheme = parsed_url.scheme
      
              if headers is None:
                  headers = self.headers
      
              if not isinstance(retries, Retry):
                  retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
      
              if release_conn is None:
                  release_conn = preload_content
      
              # Check host
              if assert_same_host and not self.is_same_host(url):
                  raise HostChangedError(self, url, retries)
      
              # Ensure that the URL we're connecting to is properly encoded
              if url.startswith("/"):
                  url = to_str(_encode_target(url))
              else:
                  url = to_str(parsed_url.url)
      
              conn = None
      
              # Track whether `conn` needs to be released before
              # returning/raising/recursing. Update this variable if necessary, and
              # leave `release_conn` constant throughout the function. That way, if
              # the function recurses, the original value of `release_conn` will be
              # passed down into the recursive call, and its value will be respected.
              #
              # See issue #651 [1] for details.
              #
              # [1] <https://github.com/urllib3/urllib3/issues/651>
              release_this_conn = release_conn
      
              http_tunnel_required = connection_requires_http_tunnel(
                  self.proxy, self.proxy_config, destination_scheme
              )
      
              # Merge the proxy headers. Only done when not using HTTP CONNECT. We
              # have to copy the headers dict so we can safely change it without those
              # changes being reflected in anyone else's copy.
              if not http_tunnel_required:
                  headers = headers.copy()  # type: ignore[attr-defined]
                  headers.update(self.proxy_headers)  # type: ignore[union-attr]
      
              # Must keep the exception bound to a separate variable or else Python 3
              # complains about UnboundLocalError.
              err = None
      
              # Keep track of whether we cleanly exited the except block. This
              # ensures we do proper cleanup in finally.
              clean_exit = False
      
              # Rewind body position, if needed. Record current position
              # for future rewinds in the event of a redirect/retry.
              body_pos = set_file_position(body, body_pos)
      
              try:
                  # Request a connection from the queue.
                  timeout_obj = self._get_timeout(timeout)
                  conn = self._get_conn(timeout=pool_timeout)
      
                  conn.timeout = timeout_obj.connect_timeout  # type: ignore[assignment]
      
                  # Is this a closed/new connection that requires CONNECT tunnelling?
                  if self.proxy is not None and http_tunnel_required and conn.is_closed:
                      try:
                          self._prepare_proxy(conn)
                      except (BaseSSLError, OSError, SocketTimeout) as e:
                          self._raise_timeout(
                              err=e, url=self.proxy.url, timeout_value=conn.timeout
                          )
                          raise
      
                  # If we're going to release the connection in ``finally:``, then
                  # the response doesn't need to know about the connection. Otherwise
                  # it will also try to release it and we'll have a double-release
                  # mess.
                  response_conn = conn if not release_conn else None
      
                  # Make the request on the HTTPConnection object
      >           response = self._make_request(
                      conn,
                      method,
                      url,
                      timeout=timeout_obj,
                      body=body,
                      headers=headers,
                      chunked=chunked,
                      retries=retries,
                      response_conn=response_conn,
                      preload_content=preload_content,
                      decode_content=decode_content,
                      **response_kw,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:789: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:495: in _make_request
          conn.request(
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:441: in request
          self.endheaders()
      .pixi/envs/default/lib/python3.8/http/client.py:1251: in endheaders
          self._send_output(message_body, encode_chunked=encode_chunked)
      .pixi/envs/default/lib/python3.8/http/client.py:1011: in _send_output
          self.send(msg)
      .pixi/envs/default/lib/python3.8/http/client.py:951: in send
          self.connect()
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:279: in connect
          self.sock = self._new_conn()
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <urllib3.connection.HTTPConnection object at 0x7fe1c4ec2550>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
                  sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
              except socket.gaierror as e:
                  raise NameResolutionError(self.host, self, e) from e
              except SocketTimeout as e:
                  raise ConnectTimeoutError(
                      self,
                      f"Connection to {self.host} timed out. (connect timeout={self.timeout})",
                  ) from e
      
              except OSError as e:
      >           raise NewConnectionError(
                      self, f"Failed to establish a new connection: {e}"
                  ) from e
      E           urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7fe1c4ec2550>: Failed to establish a new connection: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:214: NewConnectionError
      
      The above exception was the direct cause of the following exception:
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c4ec2c40>
      request = <PreparedRequest [GET]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
      >           resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:667: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:843: in urlopen
          retries = retries.increment(
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      method = 'GET', url = '/demo/None', response = None
      error = NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4ec2550>: Failed to establish a new connection: [Errno 111] Connection refused')
      _pool = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c4ec2a00>
      _stacktrace = <traceback object at 0x7fe1c4f4bfc0>
      
          def increment(
              self,
              method: str | None = None,
              url: str | None = None,
              response: BaseHTTPResponse | None = None,
              error: Exception | None = None,
              _pool: ConnectionPool | None = None,
              _stacktrace: TracebackType | None = None,
          ) -> Self:
              """Return a new Retry object with incremented retry counters.
      
              :param response: A response object, or None, if the server did not
                  return a response.
              :type response: :class:`~urllib3.response.BaseHTTPResponse`
              :param Exception error: An error encountered during the request, or
                  None if the response was received successfully.
      
              :return: A new ``Retry`` object.
              """
              if self.total is False and error:
                  # Disabled, indicate to re-raise the error.
                  raise reraise(type(error), error, _stacktrace)
      
              total = self.total
              if total is not None:
                  total -= 1
      
              connect = self.connect
              read = self.read
              redirect = self.redirect
              status_count = self.status
              other = self.other
              cause = "unknown"
              status = None
              redirect_location = None
      
              if error and self._is_connection_error(error):
                  # Connect retry?
                  if connect is False:
                      raise reraise(type(error), error, _stacktrace)
                  elif connect is not None:
                      connect -= 1
      
              elif error and self._is_read_error(error):
                  # Read retry?
                  if read is False or method is None or not self._is_method_retryable(method):
                      raise reraise(type(error), error, _stacktrace)
                  elif read is not None:
                      read -= 1
      
              elif error:
                  # Other retry?
                  if other is not None:
                      other -= 1
      
              elif response and response.get_redirect_location():
                  # Redirect retry?
                  if redirect is not None:
                      redirect -= 1
                  cause = "too many redirects"
                  response_redirect_location = response.get_redirect_location()
                  if response_redirect_location:
                      redirect_location = response_redirect_location
                  status = response.status
      
              else:
                  # Incrementing because of a server error like a 500 in
                  # status_forcelist and the given method is in the allowed_methods
                  cause = ResponseError.GENERIC_ERROR
                  if response and response.status:
                      if status_count is not None:
                          status_count -= 1
                      cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status)
                      status = response.status
      
              history = self.history + (
                  RequestHistory(method, url, error, status, redirect_location),
              )
      
              new_retry = self.new(
                  total=total,
                  connect=connect,
                  read=read,
                  redirect=redirect,
                  status=status_count,
                  other=other,
                  history=history,
              )
      
              if new_retry.is_exhausted():
                  reason = error or ResponseError(cause)
      >           raise MaxRetryError(_pool, url, reason) from reason  # type: ignore[arg-type]
      E           urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4ec2550>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/retry.py:519: MaxRetryError
      
      During handling of the above exception, another exception occurred:
      
      self = <elog.logbook.Logbook object at 0x7fe1c4edaf40>, msg_id = None
      timeout = None
      
          def _check_if_message_on_server(self, msg_id, timeout=None):
              """Try to load page for specific message. If there is a html tag like <td class="errormsg"> then there is no
              such message.
      
              :param msg_id: ID of message to be checked
              :params timeout: The value of timeout to be passed to the get request
              :return:
              """
      
              request_headers = dict()
              if self._user or self._password:
                  request_headers['Cookie'] = self._make_user_and_pswd_cookie()
              try:
      >           response = requests.get(self._url + str(msg_id), headers=request_headers, allow_redirects=False,
                                          verify=False, timeout=timeout)
      
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:581: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:73: in get
          return request("get", url, params=params, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:59: in request
          return session.request(method=method, url=url, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:589: in request
          resp = self.send(prep, **send_kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:703: in send
          r = adapter.send(request, **kwargs)
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c4ec2c40>
      request = <PreparedRequest [GET]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
                  resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
              except (ProtocolError, OSError) as err:
                  raise ConnectionError(err, request=request)
      
              except MaxRetryError as e:
                  if isinstance(e.reason, ConnectTimeoutError):
                      # TODO: Remove this in 3.0.0: see #2811
                      if not isinstance(e.reason, NewConnectionError):
                          raise ConnectTimeout(e, request=request)
      
                  if isinstance(e.reason, ResponseError):
                      raise RetryError(e, request=request)
      
                  if isinstance(e.reason, _ProxyError):
                      raise ProxyError(e, request=request)
      
                  if isinstance(e.reason, _SSLError):
                      # This branch is for urllib3 v1.22 and later.
                      raise SSLError(e, request=request)
      
      >           raise ConnectionError(e, request=request)
      E           requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4ec2550>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:700: ConnectionError
      
      During handling of the above exception, another exception occurred:
      
          def test_get_default_elog_instance_with_direct_password_and_real_check():
              url = "http://localhost:8080/demo"
              user = "robot"
              password = "testpassword"
              text = "This is a message1"
      
              elog = Elog("http://localhost:8080/demo", user=user, password=password)
      
              try:
      >           msg_id = elog.post(text)
      
      tests/test_utils_elog.py:22: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      slic/utils/elog.py:16: in post
          return self._log.post(*args, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:307: in post
          self._check_if_message_on_server(msg_id)  # raises exceptions if no message or no response from server
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <elog.logbook.Logbook object at 0x7fe1c4edaf40>, msg_id = None
      timeout = None
      
          def _check_if_message_on_server(self, msg_id, timeout=None):
              """Try to load page for specific message. If there is a html tag like <td class="errormsg"> then there is no
              such message.
      
              :param msg_id: ID of message to be checked
              :params timeout: The value of timeout to be passed to the get request
              :return:
              """
      
              request_headers = dict()
              if self._user or self._password:
                  request_headers['Cookie'] = self._make_user_and_pswd_cookie()
              try:
                  response = requests.get(self._url + str(msg_id), headers=request_headers, allow_redirects=False,
                                          verify=False, timeout=timeout)
      
                  # If there is no message code 200 will be returned (OK) and _validate_response will not recognise it
                  # but there will be some error in the html code.
                  resp_message, resp_headers, resp_msg_id = _validate_response(response)
                  # If there is no message, code 200 will be returned (OK) but there will be some error indication in
                  # the html code.
                  if re.findall('<td.*?class="errormsg".*?>.*?</td>',
                                resp_message.decode('utf-8', 'ignore'),
                                flags=re.DOTALL):
                      raise LogbookInvalidMessageID('Message with ID: ' + str(msg_id) + ' does not exist on logbook.')
      
              except requests.Timeout as e:
                  # Catch here a timeout o the post request.
                  # Raise the logbook exception and let the user handle it
                  raise LogbookServerTimeout('{0} method cannot be completed because of a network timeout:\n' +
                                             '{1}'.format(sys._getframe().f_code.co_name, e))
      
              except requests.RequestException as e:
      >           raise LogbookServerProblem('No response from the logbook server.\nDetails: ' + '{0}'.format(e))
      E           elog.logbook_exceptions.LogbookServerProblem: No response from the logbook server.
      E           Details: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4ec2550>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:601: LogbookServerProblem
      
      During handling of the above exception, another exception occurred:
      
          def test_get_default_elog_instance_with_direct_password_and_real_check():
              url = "http://localhost:8080/demo"
              user = "robot"
              password = "testpassword"
              text = "This is a message1"
      
              elog = Elog("http://localhost:8080/demo", user=user, password=password)
      
              try:
                  msg_id = elog.post(text)
              except Exception as e:
      >           pytest.fail(f"elog.post() raised an unexpected exception: {e}")
      E           Failed: elog.post() raised an unexpected exception: No response from the logbook server.
      E           Details: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4ec2550>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      tests/test_utils_elog.py:24: Failed
      

      📌 Teardown phase

      duration:

      0.00023862998932600021
      

      outcome:

      passed
      

    Function: test_get_default_elog_instance_asks_password_and_opens

    • Test 179

      📌 Setup phase

      duration:

      0.00013347715139389038
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.007868850603699684
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_elog.py
      lineno: 57
      message: Failed: elog.post() raised an unexpected exception: No response from the logbook server.
      Details: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4e5f640>: Failed to establish a new connection: [Errno 111] Connection refused'))
      

      traceback:

      -   path: tests/test_utils_elog.py
        lineno: 57
        message: Failed
      

      longrepr:

      self = <urllib3.connection.HTTPConnection object at 0x7fe1c16ba910>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
      >           sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:199: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:85: in create_connection
          raise err
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      address = ('localhost', 8080), timeout = None, source_address = None
      socket_options = [(6, 1, 1)]
      
          def create_connection(
              address: tuple[str, int],
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              source_address: tuple[str, int] | None = None,
              socket_options: _TYPE_SOCKET_OPTIONS | None = None,
          ) -> socket.socket:
              """Connect to *address* and return the socket object.
      
              Convenience function.  Connect to *address* (a 2-tuple ``(host,
              port)``) and return the socket object.  Passing the optional
              *timeout* parameter will set the timeout on the socket instance
              before attempting to connect.  If no *timeout* is supplied, the
              global default timeout setting returned by :func:`socket.getdefaulttimeout`
              is used.  If *source_address* is set it must be a tuple of (host, port)
              for the socket to bind as a source address before making the connection.
              An host of '' or port 0 tells the OS to use the default.
              """
      
              host, port = address
              if host.startswith("["):
                  host = host.strip("[]")
              err = None
      
              # Using the value from allowed_gai_family() in the context of getaddrinfo lets
              # us select whether to work with IPv4 DNS records, IPv6 records, or both.
              # The original create_connection function always returns all records.
              family = allowed_gai_family()
      
              try:
                  host.encode("idna")
              except UnicodeError:
                  raise LocationParseError(f"'{host}', label empty or too long") from None
      
              for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
                  af, socktype, proto, canonname, sa = res
                  sock = None
                  try:
                      sock = socket.socket(af, socktype, proto)
      
                      # If provided, set socket level options before connecting.
                      _set_socket_options(sock, socket_options)
      
                      if timeout is not _DEFAULT_TIMEOUT:
                          sock.settimeout(timeout)
                      if source_address:
                          sock.bind(source_address)
      >               sock.connect(sa)
      E               ConnectionRefusedError: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:73: ConnectionRefusedError
      
      The above exception was the direct cause of the following exception:
      
      self = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c16ba0d0>
      method = 'POST', url = '/demo/'
      body = b'--a74bb99087726f476471e40715dfd898\r\nContent-Disposition: form-data; name="Author"\r\n\r\nrobot\r\n--a74bb99087726f...Disposition: form-data; name="Text"; filename=""\r\n\r\nThis is a message2\r\n--a74bb99087726f476471e40715dfd898--\r\n'
      headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '736', 'Content-Type': 'multipart/form-data; boundary=a74bb99087726f476471e40715dfd898'}
      retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      redirect = False, assert_same_host = False
      timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
      release_conn = False, chunked = False, body_pos = None, preload_content = False
      decode_content = False, response_kw = {}
      parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/demo/', query=None, fragment=None)
      destination_scheme = None, conn = None, release_this_conn = True
      http_tunnel_required = False, err = None, clean_exit = False
      
          def urlopen(  # type: ignore[override]
              self,
              method: str,
              url: str,
              body: _TYPE_BODY | None = None,
              headers: typing.Mapping[str, str] | None = None,
              retries: Retry | bool | int | None = None,
              redirect: bool = True,
              assert_same_host: bool = True,
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              pool_timeout: int | None = None,
              release_conn: bool | None = None,
              chunked: bool = False,
              body_pos: _TYPE_BODY_POSITION | None = None,
              preload_content: bool = True,
              decode_content: bool = True,
              **response_kw: typing.Any,
          ) -> BaseHTTPResponse:
              """
              Get a connection from the pool and perform an HTTP request. This is the
              lowest level call for making a request, so you'll need to specify all
              the raw details.
      
              .. note::
      
                 More commonly, it's appropriate to use a convenience method
                 such as :meth:`request`.
      
              .. note::
      
                 `release_conn` will only behave as expected if
                 `preload_content=False` because we want to make
                 `preload_content=False` the default behaviour someday soon without
                 breaking backwards compatibility.
      
              :param method:
                  HTTP request method (such as GET, POST, PUT, etc.)
      
              :param url:
                  The URL to perform the request on.
      
              :param body:
                  Data to send in the request body, either :class:`str`, :class:`bytes`,
                  an iterable of :class:`str`/:class:`bytes`, or a file-like object.
      
              :param headers:
                  Dictionary of custom headers to send, such as User-Agent,
                  If-None-Match, etc. If None, pool headers are used. If provided,
                  these headers completely replace any pool-specific headers.
      
              :param retries:
                  Configure the number of retries to allow before raising a
                  :class:`~urllib3.exceptions.MaxRetryError` exception.
      
                  If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
                  :class:`~urllib3.util.retry.Retry` object for fine-grained control
                  over different types of retries.
                  Pass an integer number to retry connection errors that many times,
                  but no other types of errors. Pass zero to never retry.
      
                  If ``False``, then retries are disabled and any exception is raised
                  immediately. Also, instead of raising a MaxRetryError on redirects,
                  the redirect response will be returned.
      
              :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
      
              :param redirect:
                  If True, automatically handle redirects (status codes 301, 302,
                  303, 307, 308). Each redirect counts as a retry. Disabling retries
                  will disable redirect, too.
      
              :param assert_same_host:
                  If ``True``, will make sure that the host of the pool requests is
                  consistent else will raise HostChangedError. When ``False``, you can
                  use the pool on an HTTP proxy and request foreign hosts.
      
              :param timeout:
                  If specified, overrides the default timeout for this one
                  request. It may be a float (in seconds) or an instance of
                  :class:`urllib3.util.Timeout`.
      
              :param pool_timeout:
                  If set and the pool is set to block=True, then this method will
                  block for ``pool_timeout`` seconds and raise EmptyPoolError if no
                  connection is available within the time period.
      
              :param bool preload_content:
                  If True, the response's body will be preloaded into memory.
      
              :param bool decode_content:
                  If True, will attempt to decode the body based on the
                  'content-encoding' header.
      
              :param release_conn:
                  If False, then the urlopen call will not release the connection
                  back into the pool once a response is received (but will release if
                  you read the entire contents of the response such as when
                  `preload_content=True`). This is useful if you're not preloading
                  the response's content immediately. You will need to call
                  ``r.release_conn()`` on the response ``r`` to return the connection
                  back into the pool. If None, it takes the value of ``preload_content``
                  which defaults to ``True``.
      
              :param bool chunked:
                  If True, urllib3 will send the body using chunked transfer
                  encoding. Otherwise, urllib3 will send the body using the standard
                  content-length form. Defaults to False.
      
              :param int body_pos:
                  Position to seek to in file-like body in the event of a retry or
                  redirect. Typically this won't need to be set because urllib3 will
                  auto-populate the value when needed.
              """
              parsed_url = parse_url(url)
              destination_scheme = parsed_url.scheme
      
              if headers is None:
                  headers = self.headers
      
              if not isinstance(retries, Retry):
                  retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
      
              if release_conn is None:
                  release_conn = preload_content
      
              # Check host
              if assert_same_host and not self.is_same_host(url):
                  raise HostChangedError(self, url, retries)
      
              # Ensure that the URL we're connecting to is properly encoded
              if url.startswith("/"):
                  url = to_str(_encode_target(url))
              else:
                  url = to_str(parsed_url.url)
      
              conn = None
      
              # Track whether `conn` needs to be released before
              # returning/raising/recursing. Update this variable if necessary, and
              # leave `release_conn` constant throughout the function. That way, if
              # the function recurses, the original value of `release_conn` will be
              # passed down into the recursive call, and its value will be respected.
              #
              # See issue #651 [1] for details.
              #
              # [1] <https://github.com/urllib3/urllib3/issues/651>
              release_this_conn = release_conn
      
              http_tunnel_required = connection_requires_http_tunnel(
                  self.proxy, self.proxy_config, destination_scheme
              )
      
              # Merge the proxy headers. Only done when not using HTTP CONNECT. We
              # have to copy the headers dict so we can safely change it without those
              # changes being reflected in anyone else's copy.
              if not http_tunnel_required:
                  headers = headers.copy()  # type: ignore[attr-defined]
                  headers.update(self.proxy_headers)  # type: ignore[union-attr]
      
              # Must keep the exception bound to a separate variable or else Python 3
              # complains about UnboundLocalError.
              err = None
      
              # Keep track of whether we cleanly exited the except block. This
              # ensures we do proper cleanup in finally.
              clean_exit = False
      
              # Rewind body position, if needed. Record current position
              # for future rewinds in the event of a redirect/retry.
              body_pos = set_file_position(body, body_pos)
      
              try:
                  # Request a connection from the queue.
                  timeout_obj = self._get_timeout(timeout)
                  conn = self._get_conn(timeout=pool_timeout)
      
                  conn.timeout = timeout_obj.connect_timeout  # type: ignore[assignment]
      
                  # Is this a closed/new connection that requires CONNECT tunnelling?
                  if self.proxy is not None and http_tunnel_required and conn.is_closed:
                      try:
                          self._prepare_proxy(conn)
                      except (BaseSSLError, OSError, SocketTimeout) as e:
                          self._raise_timeout(
                              err=e, url=self.proxy.url, timeout_value=conn.timeout
                          )
                          raise
      
                  # If we're going to release the connection in ``finally:``, then
                  # the response doesn't need to know about the connection. Otherwise
                  # it will also try to release it and we'll have a double-release
                  # mess.
                  response_conn = conn if not release_conn else None
      
                  # Make the request on the HTTPConnection object
      >           response = self._make_request(
                      conn,
                      method,
                      url,
                      timeout=timeout_obj,
                      body=body,
                      headers=headers,
                      chunked=chunked,
                      retries=retries,
                      response_conn=response_conn,
                      preload_content=preload_content,
                      decode_content=decode_content,
                      **response_kw,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:789: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:495: in _make_request
          conn.request(
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:441: in request
          self.endheaders()
      .pixi/envs/default/lib/python3.8/http/client.py:1251: in endheaders
          self._send_output(message_body, encode_chunked=encode_chunked)
      .pixi/envs/default/lib/python3.8/http/client.py:1011: in _send_output
          self.send(msg)
      .pixi/envs/default/lib/python3.8/http/client.py:951: in send
          self.connect()
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:279: in connect
          self.sock = self._new_conn()
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <urllib3.connection.HTTPConnection object at 0x7fe1c16ba910>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
                  sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
              except socket.gaierror as e:
                  raise NameResolutionError(self.host, self, e) from e
              except SocketTimeout as e:
                  raise ConnectTimeoutError(
                      self,
                      f"Connection to {self.host} timed out. (connect timeout={self.timeout})",
                  ) from e
      
              except OSError as e:
      >           raise NewConnectionError(
                      self, f"Failed to establish a new connection: {e}"
                  ) from e
      E           urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7fe1c16ba910>: Failed to establish a new connection: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:214: NewConnectionError
      
      The above exception was the direct cause of the following exception:
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c16a6fa0>
      request = <PreparedRequest [POST]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
      >           resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:667: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:843: in urlopen
          retries = retries.increment(
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      method = 'POST', url = '/demo/', response = None
      error = NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c16ba910>: Failed to establish a new connection: [Errno 111] Connection refused')
      _pool = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c16ba0d0>
      _stacktrace = <traceback object at 0x7fe1c4885880>
      
          def increment(
              self,
              method: str | None = None,
              url: str | None = None,
              response: BaseHTTPResponse | None = None,
              error: Exception | None = None,
              _pool: ConnectionPool | None = None,
              _stacktrace: TracebackType | None = None,
          ) -> Self:
              """Return a new Retry object with incremented retry counters.
      
              :param response: A response object, or None, if the server did not
                  return a response.
              :type response: :class:`~urllib3.response.BaseHTTPResponse`
              :param Exception error: An error encountered during the request, or
                  None if the response was received successfully.
      
              :return: A new ``Retry`` object.
              """
              if self.total is False and error:
                  # Disabled, indicate to re-raise the error.
                  raise reraise(type(error), error, _stacktrace)
      
              total = self.total
              if total is not None:
                  total -= 1
      
              connect = self.connect
              read = self.read
              redirect = self.redirect
              status_count = self.status
              other = self.other
              cause = "unknown"
              status = None
              redirect_location = None
      
              if error and self._is_connection_error(error):
                  # Connect retry?
                  if connect is False:
                      raise reraise(type(error), error, _stacktrace)
                  elif connect is not None:
                      connect -= 1
      
              elif error and self._is_read_error(error):
                  # Read retry?
                  if read is False or method is None or not self._is_method_retryable(method):
                      raise reraise(type(error), error, _stacktrace)
                  elif read is not None:
                      read -= 1
      
              elif error:
                  # Other retry?
                  if other is not None:
                      other -= 1
      
              elif response and response.get_redirect_location():
                  # Redirect retry?
                  if redirect is not None:
                      redirect -= 1
                  cause = "too many redirects"
                  response_redirect_location = response.get_redirect_location()
                  if response_redirect_location:
                      redirect_location = response_redirect_location
                  status = response.status
      
              else:
                  # Incrementing because of a server error like a 500 in
                  # status_forcelist and the given method is in the allowed_methods
                  cause = ResponseError.GENERIC_ERROR
                  if response and response.status:
                      if status_count is not None:
                          status_count -= 1
                      cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status)
                      status = response.status
      
              history = self.history + (
                  RequestHistory(method, url, error, status, redirect_location),
              )
      
              new_retry = self.new(
                  total=total,
                  connect=connect,
                  read=read,
                  redirect=redirect,
                  status=status_count,
                  other=other,
                  history=history,
              )
      
              if new_retry.is_exhausted():
                  reason = error or ResponseError(cause)
      >           raise MaxRetryError(_pool, url, reason) from reason  # type: ignore[arg-type]
      E           urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c16ba910>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/retry.py:519: MaxRetryError
      
      During handling of the above exception, another exception occurred:
      
      self = <elog.logbook.Logbook object at 0x7fe1c15d64c0>
      message = 'This is a message2', msg_id = None, reply = False
      attributes = {'Author': 'robot', 'When': 1756165751, 'cmd': 'Submit', 'exp': 'demo', ...}
      attachments = [], suppress_email_notification = False, encoding = None
      timeout = None, kwargs = {'Author': 'robot'}
      new_attachment_list = [('Text', ('', b'This is a message2'))]
      objects_to_close = []
      attributes_to_edit = {'Author': b'robot', 'When': 1756165751, 'cmd': b'Submit', 'exp': b'demo', ...}
      
          def post(self, message, msg_id=None, reply=False, attributes=None, attachments=None,
                   suppress_email_notification=False, encoding=None, timeout=None, **kwargs):
              """
              Posts message to the logbook. If msg_id is not specified new message will be created, otherwise existing
              message will be edited, or a reply (if reply=True) to it will be created. This method returns the msg_id
              of the newly created message.
      
              :param message: string with message text
              :param msg_id: ID number of message to edit or reply. If not specified new message is created.
              :param reply: If 'True' reply to existing message is created instead of editing it
              :param attributes: Dictionary of attributes. Following attributes are used internally by the elog and will be
                                 ignored: Text, Date, Encoding, Reply to, In reply to, Locked by, Attachment
              :param attachments: list of:
                                        - file like objects which read() will return bytes (if file_like_object.name is not
                                          defined, default name "attachment<i>" will be used.
                                        - paths to the files
                                  All items will be appended as attachment to the elog entry. In case of unknown
                                  attachment an exception LogbookInvalidAttachment will be raised.
              :param suppress_email_notification: If set to True or 1, E-Mail notification will be suppressed, defaults to False.
              :param encoding: Defines encoding of the message. Can be: 'plain' -> plain text, 'html'->html-text,
                               'ELCode' --> elog formatting syntax
              :param timeout: Define the timeout to be used by the post request. Its value is directly passed to the requests
                              post. Use None to disable the request timeout.
              :param kwargs: Anything in the kwargs will be interpreted as attribute. e.g.: logbook.post('Test text',
                             Author='Rok Vintar), "Author" will be sent as an attribute. If named same as one of the
                             attributes defined in "attributes", kwargs will have priority.
      
              :return: msg_id
              """
      
              attributes = attributes or {}
              attributes = {**attributes, **kwargs}  # kwargs as attributes with higher priority
      
              attachments = attachments or []
      
              if encoding is not None:
                  if encoding not in ['plain', 'HTML', 'ELCode']:
                      raise LogbookMessageRejected('Invalid message encoding. Valid options: plain, HTML, ELCode.')
                  attributes['Encoding'] = encoding
      
              if suppress_email_notification:
                  attributes["suppress"] = 1
      
              # THE ATTACHMENT STRATEGY WHEN DEALING WITH POST MODIFICATION
              #
              # 1. Does the message on the server have already attachments?
              #    1.1 - We read the message getting the existing attachment list.
              #    1.2 - Add to the attributes dictionary one line for each attachment like this:
              #       attributes['attachmentN'] = timestamped_filename_name
              #
              # 2. Do we have new attachments?
              #    2.1 - Those are in the new_attachment_list. This is a list of this type:
              #       [ ('attfileN', ('filename', fileobject)) ]
              #    2.2 - We need to loop over all the new attachments:
              #       2.2.1 - Does a file already on the server with the same name exist?
              #         2.2.1.1 - No: OK. Then we go ahead with the next attachment.
              #         2.2.1.2 - Yes:
              #           2.2.1.2.1 - Are the two files identical?
              #               2.2.1.2.1.1 - Yes: then we remove this current entry from the new_attachment_list and we leave the one
              #                      already on server.
              #               2.2.1.2.1.2 - No:
              #                  2.2.1.2.1.2.1 - Then the file has been update.
              #                  2.2.1.2.1.2.2 - We need to remove the file on server first (using special post)
              #                  2.2.1.2.1.2.3 - We have to remove the old attachment from the attributes dictionary.
              #
      
              if attachments:
                  # here we accomplish point 2.1.
                  # new_attachment_list is something like [ ('attfileN', ('filename', fileobject)) ]
                  new_attachment_list, objects_to_close = self._prepare_attachments(attachments)
              else:
                  objects_to_close = list()
                  new_attachment_list = list()
      
              attributes_to_edit = dict()
              if msg_id:
                  # Message exists, we can continue
                  if reply:
                      # Verify that there is a message on the server, otherwise do not reply to it!
                      self._check_if_message_on_server(msg_id)  # raises exception in case of none existing message
                      attributes['reply_to'] = str(msg_id)
                  else:  # Edit existing
                      attributes['edit_id'] = str(msg_id)
                      attributes['skiplock'] = '1'
      
                      # here we accomplish point 1.1.
                      # existing_attachments_list is something like:
                      # [ 'https://elog.url.com/logbook/timestamped_filename' ]
                      msg_to_edit, attributes_to_edit, existing_attachments_list = self.read(msg_id)
      
                      for attribute, data in attributes.items():
                          new_data = attributes.get(attribute)
                          if new_data is not None:
                              attributes_to_edit[attribute] = new_data
      
                      i = 0
                      existing_attachments_filename_list = list()
                      for attachment in existing_attachments_list:
                          # here we accomplish point 1.2. We strip the timestamped_filename from the whole URL.
                          attributes_to_edit[f'attachment{i}'] = os.path.basename(attachment)
                          existing_attachments_filename_list.append(os.path.basename(attachment)[14:])
                          i += 1
      
                      # let's accomplish 2.2. Loop over all new attachment
                      duplicate_attachment_list = list()
                      for new_attachment in new_attachment_list:
                          # the new_attachment_list is something like:
                          # [ ('attfileN', ('filename', fileobject)) ]
                          new_attachment_filename = new_attachment[1][0]
                          if new_attachment_filename in existing_attachments_filename_list:
                              # a file with the same name existing already on the server.
                              # we need to check if the two files are the same.
                              # read the content of the new file
                              new_attachment_content = new_attachment[1][1].read()
                              # don't forget to reset the fileobj to the beginning of the file
                              new_attachment[1][1].seek(0)
                              # get the existing attachment content
                              attachment_index = existing_attachments_filename_list.index(new_attachment_filename)
                              existing_attachment_content = self.download_attachment(
                                  url=existing_attachments_list[attachment_index],
                                  timeout=timeout
                              )
                              # check if the two contents are the same
                              if new_attachment_content == existing_attachment_content:
                                  # yes. then we don't upload a second copy. we remove the current entry from the list
                                  duplicate_attachment_list.append(new_attachment)
                              else:
                                  # no. they are not the same file. we will replace the existing file with the new one
                                  # first: we need to remove the attachment from the server using the dedicated method
                                  self.delete_attachment(msg_id, attributes=attributes_to_edit,
                                                         attachment_id=attachment_index,
                                                         timeout=timeout, text=msg_to_edit)
                                  # now we can remove this attachment from the auxiliary lists.
                                  existing_attachments_filename_list.pop(attachment_index)
                                  existing_attachments_list.pop(attachment_index)
                                  # now we need to rebuild the attributes dictionary for the part concerning the attachments.
                                  # we remove all of them first
                                  keys_to_be_removed = list()
                                  for key in attributes_to_edit.keys():
                                      if key.startswith('attachment'):
                                          keys_to_be_removed.append(key)
                                      if key.startswith('delatt'):
                                          keys_to_be_removed.append(key)
                                  for key in keys_to_be_removed:
                                      del attributes_to_edit[key]
      
                                  # now we rebuild it
                                  for i, attachment in enumerate(existing_attachments_list):
                                      attributes_to_edit[f'attachment{i}'] = os.path.basename(attachment)
      
                      # remove all duplicate attachments from the new_attachment_list
                      for attach in duplicate_attachment_list:
                          new_attachment_list.remove(attach)
      
              else:
                  # As we create a new message, specify creation time if not already specified in attributes
                  if 'When' not in attributes:
                      attributes['When'] = int(datetime.now().timestamp())
      
              if not attributes_to_edit:
                  attributes_to_edit = attributes
      
              # Remove any attributes that should not be sent
              _remove_reserved_attributes(attributes_to_edit)
      
              # Make requests module think that Text is a "file". This is the only way to force requests to send data as
              # multipart/form-data even if there are no attachments. Elog understands only multipart/form-data
              new_attachment_list.append(('Text', ('', message.encode('iso-8859-1'))))
      
              # Base attributes are common to all messages
              self._add_base_msg_attributes(attributes_to_edit)
      
              # Keys in attributes cannot have certain characters like whitespaces or dashes for the http request
              attributes_to_edit = _replace_special_characters_in_attribute_keys(attributes_to_edit)
      
              # All string values in the attributes must be encoded in latin1
              attributes_to_edit = _encode_values(attributes_to_edit)
      
              try:
      >           response = requests.post(self._url, data=attributes_to_edit, files=new_attachment_list,
                                           allow_redirects=False, verify=False, timeout=timeout)
      
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:288: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:115: in post
          return request("post", url, data=data, json=json, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:59: in request
          return session.request(method=method, url=url, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:589: in request
          resp = self.send(prep, **send_kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:703: in send
          r = adapter.send(request, **kwargs)
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c16a6fa0>
      request = <PreparedRequest [POST]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
                  resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
              except (ProtocolError, OSError) as err:
                  raise ConnectionError(err, request=request)
      
              except MaxRetryError as e:
                  if isinstance(e.reason, ConnectTimeoutError):
                      # TODO: Remove this in 3.0.0: see #2811
                      if not isinstance(e.reason, NewConnectionError):
                          raise ConnectTimeout(e, request=request)
      
                  if isinstance(e.reason, ResponseError):
                      raise RetryError(e, request=request)
      
                  if isinstance(e.reason, _ProxyError):
                      raise ProxyError(e, request=request)
      
                  if isinstance(e.reason, _SSLError):
                      # This branch is for urllib3 v1.22 and later.
                      raise SSLError(e, request=request)
      
      >           raise ConnectionError(e, request=request)
      E           requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c16ba910>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:700: ConnectionError
      
      During handling of the above exception, another exception occurred:
      
      self = <urllib3.connection.HTTPConnection object at 0x7fe1c4e5f640>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
      >           sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:199: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:85: in create_connection
          raise err
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      address = ('localhost', 8080), timeout = None, source_address = None
      socket_options = [(6, 1, 1)]
      
          def create_connection(
              address: tuple[str, int],
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              source_address: tuple[str, int] | None = None,
              socket_options: _TYPE_SOCKET_OPTIONS | None = None,
          ) -> socket.socket:
              """Connect to *address* and return the socket object.
      
              Convenience function.  Connect to *address* (a 2-tuple ``(host,
              port)``) and return the socket object.  Passing the optional
              *timeout* parameter will set the timeout on the socket instance
              before attempting to connect.  If no *timeout* is supplied, the
              global default timeout setting returned by :func:`socket.getdefaulttimeout`
              is used.  If *source_address* is set it must be a tuple of (host, port)
              for the socket to bind as a source address before making the connection.
              An host of '' or port 0 tells the OS to use the default.
              """
      
              host, port = address
              if host.startswith("["):
                  host = host.strip("[]")
              err = None
      
              # Using the value from allowed_gai_family() in the context of getaddrinfo lets
              # us select whether to work with IPv4 DNS records, IPv6 records, or both.
              # The original create_connection function always returns all records.
              family = allowed_gai_family()
      
              try:
                  host.encode("idna")
              except UnicodeError:
                  raise LocationParseError(f"'{host}', label empty or too long") from None
      
              for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
                  af, socktype, proto, canonname, sa = res
                  sock = None
                  try:
                      sock = socket.socket(af, socktype, proto)
      
                      # If provided, set socket level options before connecting.
                      _set_socket_options(sock, socket_options)
      
                      if timeout is not _DEFAULT_TIMEOUT:
                          sock.settimeout(timeout)
                      if source_address:
                          sock.bind(source_address)
      >               sock.connect(sa)
      E               ConnectionRefusedError: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:73: ConnectionRefusedError
      
      The above exception was the direct cause of the following exception:
      
      self = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c5e036a0>
      method = 'GET', url = '/demo/None', body = None
      headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'unm=robot;upwd=me1T.2jUUqQNa1wNuey9zNBOmOa4eILOaPb.ZSZjpn4;'}
      retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      redirect = False, assert_same_host = False
      timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
      release_conn = False, chunked = False, body_pos = None, preload_content = False
      decode_content = False, response_kw = {}
      parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/demo/None', query=None, fragment=None)
      destination_scheme = None, conn = None, release_this_conn = True
      http_tunnel_required = False, err = None, clean_exit = False
      
          def urlopen(  # type: ignore[override]
              self,
              method: str,
              url: str,
              body: _TYPE_BODY | None = None,
              headers: typing.Mapping[str, str] | None = None,
              retries: Retry | bool | int | None = None,
              redirect: bool = True,
              assert_same_host: bool = True,
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              pool_timeout: int | None = None,
              release_conn: bool | None = None,
              chunked: bool = False,
              body_pos: _TYPE_BODY_POSITION | None = None,
              preload_content: bool = True,
              decode_content: bool = True,
              **response_kw: typing.Any,
          ) -> BaseHTTPResponse:
              """
              Get a connection from the pool and perform an HTTP request. This is the
              lowest level call for making a request, so you'll need to specify all
              the raw details.
      
              .. note::
      
                 More commonly, it's appropriate to use a convenience method
                 such as :meth:`request`.
      
              .. note::
      
                 `release_conn` will only behave as expected if
                 `preload_content=False` because we want to make
                 `preload_content=False` the default behaviour someday soon without
                 breaking backwards compatibility.
      
              :param method:
                  HTTP request method (such as GET, POST, PUT, etc.)
      
              :param url:
                  The URL to perform the request on.
      
              :param body:
                  Data to send in the request body, either :class:`str`, :class:`bytes`,
                  an iterable of :class:`str`/:class:`bytes`, or a file-like object.
      
              :param headers:
                  Dictionary of custom headers to send, such as User-Agent,
                  If-None-Match, etc. If None, pool headers are used. If provided,
                  these headers completely replace any pool-specific headers.
      
              :param retries:
                  Configure the number of retries to allow before raising a
                  :class:`~urllib3.exceptions.MaxRetryError` exception.
      
                  If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
                  :class:`~urllib3.util.retry.Retry` object for fine-grained control
                  over different types of retries.
                  Pass an integer number to retry connection errors that many times,
                  but no other types of errors. Pass zero to never retry.
      
                  If ``False``, then retries are disabled and any exception is raised
                  immediately. Also, instead of raising a MaxRetryError on redirects,
                  the redirect response will be returned.
      
              :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
      
              :param redirect:
                  If True, automatically handle redirects (status codes 301, 302,
                  303, 307, 308). Each redirect counts as a retry. Disabling retries
                  will disable redirect, too.
      
              :param assert_same_host:
                  If ``True``, will make sure that the host of the pool requests is
                  consistent else will raise HostChangedError. When ``False``, you can
                  use the pool on an HTTP proxy and request foreign hosts.
      
              :param timeout:
                  If specified, overrides the default timeout for this one
                  request. It may be a float (in seconds) or an instance of
                  :class:`urllib3.util.Timeout`.
      
              :param pool_timeout:
                  If set and the pool is set to block=True, then this method will
                  block for ``pool_timeout`` seconds and raise EmptyPoolError if no
                  connection is available within the time period.
      
              :param bool preload_content:
                  If True, the response's body will be preloaded into memory.
      
              :param bool decode_content:
                  If True, will attempt to decode the body based on the
                  'content-encoding' header.
      
              :param release_conn:
                  If False, then the urlopen call will not release the connection
                  back into the pool once a response is received (but will release if
                  you read the entire contents of the response such as when
                  `preload_content=True`). This is useful if you're not preloading
                  the response's content immediately. You will need to call
                  ``r.release_conn()`` on the response ``r`` to return the connection
                  back into the pool. If None, it takes the value of ``preload_content``
                  which defaults to ``True``.
      
              :param bool chunked:
                  If True, urllib3 will send the body using chunked transfer
                  encoding. Otherwise, urllib3 will send the body using the standard
                  content-length form. Defaults to False.
      
              :param int body_pos:
                  Position to seek to in file-like body in the event of a retry or
                  redirect. Typically this won't need to be set because urllib3 will
                  auto-populate the value when needed.
              """
              parsed_url = parse_url(url)
              destination_scheme = parsed_url.scheme
      
              if headers is None:
                  headers = self.headers
      
              if not isinstance(retries, Retry):
                  retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
      
              if release_conn is None:
                  release_conn = preload_content
      
              # Check host
              if assert_same_host and not self.is_same_host(url):
                  raise HostChangedError(self, url, retries)
      
              # Ensure that the URL we're connecting to is properly encoded
              if url.startswith("/"):
                  url = to_str(_encode_target(url))
              else:
                  url = to_str(parsed_url.url)
      
              conn = None
      
              # Track whether `conn` needs to be released before
              # returning/raising/recursing. Update this variable if necessary, and
              # leave `release_conn` constant throughout the function. That way, if
              # the function recurses, the original value of `release_conn` will be
              # passed down into the recursive call, and its value will be respected.
              #
              # See issue #651 [1] for details.
              #
              # [1] <https://github.com/urllib3/urllib3/issues/651>
              release_this_conn = release_conn
      
              http_tunnel_required = connection_requires_http_tunnel(
                  self.proxy, self.proxy_config, destination_scheme
              )
      
              # Merge the proxy headers. Only done when not using HTTP CONNECT. We
              # have to copy the headers dict so we can safely change it without those
              # changes being reflected in anyone else's copy.
              if not http_tunnel_required:
                  headers = headers.copy()  # type: ignore[attr-defined]
                  headers.update(self.proxy_headers)  # type: ignore[union-attr]
      
              # Must keep the exception bound to a separate variable or else Python 3
              # complains about UnboundLocalError.
              err = None
      
              # Keep track of whether we cleanly exited the except block. This
              # ensures we do proper cleanup in finally.
              clean_exit = False
      
              # Rewind body position, if needed. Record current position
              # for future rewinds in the event of a redirect/retry.
              body_pos = set_file_position(body, body_pos)
      
              try:
                  # Request a connection from the queue.
                  timeout_obj = self._get_timeout(timeout)
                  conn = self._get_conn(timeout=pool_timeout)
      
                  conn.timeout = timeout_obj.connect_timeout  # type: ignore[assignment]
      
                  # Is this a closed/new connection that requires CONNECT tunnelling?
                  if self.proxy is not None and http_tunnel_required and conn.is_closed:
                      try:
                          self._prepare_proxy(conn)
                      except (BaseSSLError, OSError, SocketTimeout) as e:
                          self._raise_timeout(
                              err=e, url=self.proxy.url, timeout_value=conn.timeout
                          )
                          raise
      
                  # If we're going to release the connection in ``finally:``, then
                  # the response doesn't need to know about the connection. Otherwise
                  # it will also try to release it and we'll have a double-release
                  # mess.
                  response_conn = conn if not release_conn else None
      
                  # Make the request on the HTTPConnection object
      >           response = self._make_request(
                      conn,
                      method,
                      url,
                      timeout=timeout_obj,
                      body=body,
                      headers=headers,
                      chunked=chunked,
                      retries=retries,
                      response_conn=response_conn,
                      preload_content=preload_content,
                      decode_content=decode_content,
                      **response_kw,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:789: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:495: in _make_request
          conn.request(
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:441: in request
          self.endheaders()
      .pixi/envs/default/lib/python3.8/http/client.py:1251: in endheaders
          self._send_output(message_body, encode_chunked=encode_chunked)
      .pixi/envs/default/lib/python3.8/http/client.py:1011: in _send_output
          self.send(msg)
      .pixi/envs/default/lib/python3.8/http/client.py:951: in send
          self.connect()
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:279: in connect
          self.sock = self._new_conn()
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <urllib3.connection.HTTPConnection object at 0x7fe1c4e5f640>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
                  sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
              except socket.gaierror as e:
                  raise NameResolutionError(self.host, self, e) from e
              except SocketTimeout as e:
                  raise ConnectTimeoutError(
                      self,
                      f"Connection to {self.host} timed out. (connect timeout={self.timeout})",
                  ) from e
      
              except OSError as e:
      >           raise NewConnectionError(
                      self, f"Failed to establish a new connection: {e}"
                  ) from e
      E           urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7fe1c4e5f640>: Failed to establish a new connection: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:214: NewConnectionError
      
      The above exception was the direct cause of the following exception:
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c5e039d0>
      request = <PreparedRequest [GET]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
      >           resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:667: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:843: in urlopen
          retries = retries.increment(
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      method = 'GET', url = '/demo/None', response = None
      error = NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4e5f640>: Failed to establish a new connection: [Errno 111] Connection refused')
      _pool = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c5e036a0>
      _stacktrace = <traceback object at 0x7fe1c4a3b440>
      
          def increment(
              self,
              method: str | None = None,
              url: str | None = None,
              response: BaseHTTPResponse | None = None,
              error: Exception | None = None,
              _pool: ConnectionPool | None = None,
              _stacktrace: TracebackType | None = None,
          ) -> Self:
              """Return a new Retry object with incremented retry counters.
      
              :param response: A response object, or None, if the server did not
                  return a response.
              :type response: :class:`~urllib3.response.BaseHTTPResponse`
              :param Exception error: An error encountered during the request, or
                  None if the response was received successfully.
      
              :return: A new ``Retry`` object.
              """
              if self.total is False and error:
                  # Disabled, indicate to re-raise the error.
                  raise reraise(type(error), error, _stacktrace)
      
              total = self.total
              if total is not None:
                  total -= 1
      
              connect = self.connect
              read = self.read
              redirect = self.redirect
              status_count = self.status
              other = self.other
              cause = "unknown"
              status = None
              redirect_location = None
      
              if error and self._is_connection_error(error):
                  # Connect retry?
                  if connect is False:
                      raise reraise(type(error), error, _stacktrace)
                  elif connect is not None:
                      connect -= 1
      
              elif error and self._is_read_error(error):
                  # Read retry?
                  if read is False or method is None or not self._is_method_retryable(method):
                      raise reraise(type(error), error, _stacktrace)
                  elif read is not None:
                      read -= 1
      
              elif error:
                  # Other retry?
                  if other is not None:
                      other -= 1
      
              elif response and response.get_redirect_location():
                  # Redirect retry?
                  if redirect is not None:
                      redirect -= 1
                  cause = "too many redirects"
                  response_redirect_location = response.get_redirect_location()
                  if response_redirect_location:
                      redirect_location = response_redirect_location
                  status = response.status
      
              else:
                  # Incrementing because of a server error like a 500 in
                  # status_forcelist and the given method is in the allowed_methods
                  cause = ResponseError.GENERIC_ERROR
                  if response and response.status:
                      if status_count is not None:
                          status_count -= 1
                      cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status)
                      status = response.status
      
              history = self.history + (
                  RequestHistory(method, url, error, status, redirect_location),
              )
      
              new_retry = self.new(
                  total=total,
                  connect=connect,
                  read=read,
                  redirect=redirect,
                  status=status_count,
                  other=other,
                  history=history,
              )
      
              if new_retry.is_exhausted():
                  reason = error or ResponseError(cause)
      >           raise MaxRetryError(_pool, url, reason) from reason  # type: ignore[arg-type]
      E           urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4e5f640>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/retry.py:519: MaxRetryError
      
      During handling of the above exception, another exception occurred:
      
      self = <elog.logbook.Logbook object at 0x7fe1c15d64c0>, msg_id = None
      timeout = None
      
          def _check_if_message_on_server(self, msg_id, timeout=None):
              """Try to load page for specific message. If there is a html tag like <td class="errormsg"> then there is no
              such message.
      
              :param msg_id: ID of message to be checked
              :params timeout: The value of timeout to be passed to the get request
              :return:
              """
      
              request_headers = dict()
              if self._user or self._password:
                  request_headers['Cookie'] = self._make_user_and_pswd_cookie()
              try:
      >           response = requests.get(self._url + str(msg_id), headers=request_headers, allow_redirects=False,
                                          verify=False, timeout=timeout)
      
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:581: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:73: in get
          return request("get", url, params=params, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:59: in request
          return session.request(method=method, url=url, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:589: in request
          resp = self.send(prep, **send_kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:703: in send
          r = adapter.send(request, **kwargs)
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c5e039d0>
      request = <PreparedRequest [GET]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
                  resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
              except (ProtocolError, OSError) as err:
                  raise ConnectionError(err, request=request)
      
              except MaxRetryError as e:
                  if isinstance(e.reason, ConnectTimeoutError):
                      # TODO: Remove this in 3.0.0: see #2811
                      if not isinstance(e.reason, NewConnectionError):
                          raise ConnectTimeout(e, request=request)
      
                  if isinstance(e.reason, ResponseError):
                      raise RetryError(e, request=request)
      
                  if isinstance(e.reason, _ProxyError):
                      raise ProxyError(e, request=request)
      
                  if isinstance(e.reason, _SSLError):
                      # This branch is for urllib3 v1.22 and later.
                      raise SSLError(e, request=request)
      
      >           raise ConnectionError(e, request=request)
      E           requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4e5f640>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:700: ConnectionError
      
      During handling of the above exception, another exception occurred:
      
      mock_home = <MagicMock name='home' id='140607642663760'>
      mock_getpass = <MagicMock name='getpass' id='140607642661024'>
      
          @patch("slic.utils.elog.getpass")
          @patch("slic.utils.elog.Path.home")
          def test_get_default_elog_instance_asks_password_and_opens(mock_home, mock_getpass):
              mock_home.return_value = Path("/does/not/exist")  # Fausse home → lecture échoue
              mock_getpass.return_value = "testpassword"
              user = "robot"
              text = "This is a message2"
              url = "http://localhost:8080/demo"
      
              elog = Elog("http://localhost:8080/demo", user=user)
      
              try:
      >           msd_id = elog.post(text)
      
      tests/test_utils_elog.py:55: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      slic/utils/elog.py:16: in post
          return self._log.post(*args, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:307: in post
          self._check_if_message_on_server(msg_id)  # raises exceptions if no message or no response from server
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <elog.logbook.Logbook object at 0x7fe1c15d64c0>, msg_id = None
      timeout = None
      
          def _check_if_message_on_server(self, msg_id, timeout=None):
              """Try to load page for specific message. If there is a html tag like <td class="errormsg"> then there is no
              such message.
      
              :param msg_id: ID of message to be checked
              :params timeout: The value of timeout to be passed to the get request
              :return:
              """
      
              request_headers = dict()
              if self._user or self._password:
                  request_headers['Cookie'] = self._make_user_and_pswd_cookie()
              try:
                  response = requests.get(self._url + str(msg_id), headers=request_headers, allow_redirects=False,
                                          verify=False, timeout=timeout)
      
                  # If there is no message code 200 will be returned (OK) and _validate_response will not recognise it
                  # but there will be some error in the html code.
                  resp_message, resp_headers, resp_msg_id = _validate_response(response)
                  # If there is no message, code 200 will be returned (OK) but there will be some error indication in
                  # the html code.
                  if re.findall('<td.*?class="errormsg".*?>.*?</td>',
                                resp_message.decode('utf-8', 'ignore'),
                                flags=re.DOTALL):
                      raise LogbookInvalidMessageID('Message with ID: ' + str(msg_id) + ' does not exist on logbook.')
      
              except requests.Timeout as e:
                  # Catch here a timeout o the post request.
                  # Raise the logbook exception and let the user handle it
                  raise LogbookServerTimeout('{0} method cannot be completed because of a network timeout:\n' +
                                             '{1}'.format(sys._getframe().f_code.co_name, e))
      
              except requests.RequestException as e:
      >           raise LogbookServerProblem('No response from the logbook server.\nDetails: ' + '{0}'.format(e))
      E           elog.logbook_exceptions.LogbookServerProblem: No response from the logbook server.
      E           Details: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4e5f640>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:601: LogbookServerProblem
      
      During handling of the above exception, another exception occurred:
      
      mock_home = <MagicMock name='home' id='140607642663760'>
      mock_getpass = <MagicMock name='getpass' id='140607642661024'>
      
          @patch("slic.utils.elog.getpass")
          @patch("slic.utils.elog.Path.home")
          def test_get_default_elog_instance_asks_password_and_opens(mock_home, mock_getpass):
              mock_home.return_value = Path("/does/not/exist")  # Fausse home → lecture échoue
              mock_getpass.return_value = "testpassword"
              user = "robot"
              text = "This is a message2"
              url = "http://localhost:8080/demo"
      
              elog = Elog("http://localhost:8080/demo", user=user)
      
              try:
                  msd_id = elog.post(text)
              except Exception as e:
      >           pytest.fail(f"elog.post() raised an unexpected exception: {e}")
      E           Failed: elog.post() raised an unexpected exception: No response from the logbook server.
      E           Details: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4e5f640>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      tests/test_utils_elog.py:57: Failed
      

      📌 Teardown phase

      duration:

      0.00023711565881967545
      

      outcome:

      passed
      

    Function: test_get_default_elog_with_path_home

    • Test 180

      📌 Setup phase

      duration:

      0.0001439116895198822
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.00905660167336464
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_elog.py
      lineno: 92
      message: Failed: elog.post() raised an unexpected exception: No response from the logbook server.
      Details: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c5a98130>: Failed to establish a new connection: [Errno 111] Connection refused'))
      

      traceback:

      -   path: tests/test_utils_elog.py
        lineno: 92
        message: Failed
      

      longrepr:

      self = <urllib3.connection.HTTPConnection object at 0x7fe1c5b63f40>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
      >           sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:199: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:85: in create_connection
          raise err
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      address = ('localhost', 8080), timeout = None, source_address = None
      socket_options = [(6, 1, 1)]
      
          def create_connection(
              address: tuple[str, int],
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              source_address: tuple[str, int] | None = None,
              socket_options: _TYPE_SOCKET_OPTIONS | None = None,
          ) -> socket.socket:
              """Connect to *address* and return the socket object.
      
              Convenience function.  Connect to *address* (a 2-tuple ``(host,
              port)``) and return the socket object.  Passing the optional
              *timeout* parameter will set the timeout on the socket instance
              before attempting to connect.  If no *timeout* is supplied, the
              global default timeout setting returned by :func:`socket.getdefaulttimeout`
              is used.  If *source_address* is set it must be a tuple of (host, port)
              for the socket to bind as a source address before making the connection.
              An host of '' or port 0 tells the OS to use the default.
              """
      
              host, port = address
              if host.startswith("["):
                  host = host.strip("[]")
              err = None
      
              # Using the value from allowed_gai_family() in the context of getaddrinfo lets
              # us select whether to work with IPv4 DNS records, IPv6 records, or both.
              # The original create_connection function always returns all records.
              family = allowed_gai_family()
      
              try:
                  host.encode("idna")
              except UnicodeError:
                  raise LocationParseError(f"'{host}', label empty or too long") from None
      
              for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
                  af, socktype, proto, canonname, sa = res
                  sock = None
                  try:
                      sock = socket.socket(af, socktype, proto)
      
                      # If provided, set socket level options before connecting.
                      _set_socket_options(sock, socket_options)
      
                      if timeout is not _DEFAULT_TIMEOUT:
                          sock.settimeout(timeout)
                      if source_address:
                          sock.bind(source_address)
      >               sock.connect(sa)
      E               ConnectionRefusedError: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:73: ConnectionRefusedError
      
      The above exception was the direct cause of the following exception:
      
      self = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c5b63910>
      method = 'POST', url = '/demo/'
      body = b'--58a1169f46eda3d70e8b3de619f106e3\r\nContent-Disposition: form-data; name="Author"\r\n\r\nrobot\r\n--58a1169f46eda3...Disposition: form-data; name="Text"; filename=""\r\n\r\nThis is a message3\r\n--58a1169f46eda3d70e8b3de619f106e3--\r\n'
      headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '736', 'Content-Type': 'multipart/form-data; boundary=58a1169f46eda3d70e8b3de619f106e3'}
      retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      redirect = False, assert_same_host = False
      timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
      release_conn = False, chunked = False, body_pos = None, preload_content = False
      decode_content = False, response_kw = {}
      parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/demo/', query=None, fragment=None)
      destination_scheme = None, conn = None, release_this_conn = True
      http_tunnel_required = False, err = None, clean_exit = False
      
          def urlopen(  # type: ignore[override]
              self,
              method: str,
              url: str,
              body: _TYPE_BODY | None = None,
              headers: typing.Mapping[str, str] | None = None,
              retries: Retry | bool | int | None = None,
              redirect: bool = True,
              assert_same_host: bool = True,
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              pool_timeout: int | None = None,
              release_conn: bool | None = None,
              chunked: bool = False,
              body_pos: _TYPE_BODY_POSITION | None = None,
              preload_content: bool = True,
              decode_content: bool = True,
              **response_kw: typing.Any,
          ) -> BaseHTTPResponse:
              """
              Get a connection from the pool and perform an HTTP request. This is the
              lowest level call for making a request, so you'll need to specify all
              the raw details.
      
              .. note::
      
                 More commonly, it's appropriate to use a convenience method
                 such as :meth:`request`.
      
              .. note::
      
                 `release_conn` will only behave as expected if
                 `preload_content=False` because we want to make
                 `preload_content=False` the default behaviour someday soon without
                 breaking backwards compatibility.
      
              :param method:
                  HTTP request method (such as GET, POST, PUT, etc.)
      
              :param url:
                  The URL to perform the request on.
      
              :param body:
                  Data to send in the request body, either :class:`str`, :class:`bytes`,
                  an iterable of :class:`str`/:class:`bytes`, or a file-like object.
      
              :param headers:
                  Dictionary of custom headers to send, such as User-Agent,
                  If-None-Match, etc. If None, pool headers are used. If provided,
                  these headers completely replace any pool-specific headers.
      
              :param retries:
                  Configure the number of retries to allow before raising a
                  :class:`~urllib3.exceptions.MaxRetryError` exception.
      
                  If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
                  :class:`~urllib3.util.retry.Retry` object for fine-grained control
                  over different types of retries.
                  Pass an integer number to retry connection errors that many times,
                  but no other types of errors. Pass zero to never retry.
      
                  If ``False``, then retries are disabled and any exception is raised
                  immediately. Also, instead of raising a MaxRetryError on redirects,
                  the redirect response will be returned.
      
              :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
      
              :param redirect:
                  If True, automatically handle redirects (status codes 301, 302,
                  303, 307, 308). Each redirect counts as a retry. Disabling retries
                  will disable redirect, too.
      
              :param assert_same_host:
                  If ``True``, will make sure that the host of the pool requests is
                  consistent else will raise HostChangedError. When ``False``, you can
                  use the pool on an HTTP proxy and request foreign hosts.
      
              :param timeout:
                  If specified, overrides the default timeout for this one
                  request. It may be a float (in seconds) or an instance of
                  :class:`urllib3.util.Timeout`.
      
              :param pool_timeout:
                  If set and the pool is set to block=True, then this method will
                  block for ``pool_timeout`` seconds and raise EmptyPoolError if no
                  connection is available within the time period.
      
              :param bool preload_content:
                  If True, the response's body will be preloaded into memory.
      
              :param bool decode_content:
                  If True, will attempt to decode the body based on the
                  'content-encoding' header.
      
              :param release_conn:
                  If False, then the urlopen call will not release the connection
                  back into the pool once a response is received (but will release if
                  you read the entire contents of the response such as when
                  `preload_content=True`). This is useful if you're not preloading
                  the response's content immediately. You will need to call
                  ``r.release_conn()`` on the response ``r`` to return the connection
                  back into the pool. If None, it takes the value of ``preload_content``
                  which defaults to ``True``.
      
              :param bool chunked:
                  If True, urllib3 will send the body using chunked transfer
                  encoding. Otherwise, urllib3 will send the body using the standard
                  content-length form. Defaults to False.
      
              :param int body_pos:
                  Position to seek to in file-like body in the event of a retry or
                  redirect. Typically this won't need to be set because urllib3 will
                  auto-populate the value when needed.
              """
              parsed_url = parse_url(url)
              destination_scheme = parsed_url.scheme
      
              if headers is None:
                  headers = self.headers
      
              if not isinstance(retries, Retry):
                  retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
      
              if release_conn is None:
                  release_conn = preload_content
      
              # Check host
              if assert_same_host and not self.is_same_host(url):
                  raise HostChangedError(self, url, retries)
      
              # Ensure that the URL we're connecting to is properly encoded
              if url.startswith("/"):
                  url = to_str(_encode_target(url))
              else:
                  url = to_str(parsed_url.url)
      
              conn = None
      
              # Track whether `conn` needs to be released before
              # returning/raising/recursing. Update this variable if necessary, and
              # leave `release_conn` constant throughout the function. That way, if
              # the function recurses, the original value of `release_conn` will be
              # passed down into the recursive call, and its value will be respected.
              #
              # See issue #651 [1] for details.
              #
              # [1] <https://github.com/urllib3/urllib3/issues/651>
              release_this_conn = release_conn
      
              http_tunnel_required = connection_requires_http_tunnel(
                  self.proxy, self.proxy_config, destination_scheme
              )
      
              # Merge the proxy headers. Only done when not using HTTP CONNECT. We
              # have to copy the headers dict so we can safely change it without those
              # changes being reflected in anyone else's copy.
              if not http_tunnel_required:
                  headers = headers.copy()  # type: ignore[attr-defined]
                  headers.update(self.proxy_headers)  # type: ignore[union-attr]
      
              # Must keep the exception bound to a separate variable or else Python 3
              # complains about UnboundLocalError.
              err = None
      
              # Keep track of whether we cleanly exited the except block. This
              # ensures we do proper cleanup in finally.
              clean_exit = False
      
              # Rewind body position, if needed. Record current position
              # for future rewinds in the event of a redirect/retry.
              body_pos = set_file_position(body, body_pos)
      
              try:
                  # Request a connection from the queue.
                  timeout_obj = self._get_timeout(timeout)
                  conn = self._get_conn(timeout=pool_timeout)
      
                  conn.timeout = timeout_obj.connect_timeout  # type: ignore[assignment]
      
                  # Is this a closed/new connection that requires CONNECT tunnelling?
                  if self.proxy is not None and http_tunnel_required and conn.is_closed:
                      try:
                          self._prepare_proxy(conn)
                      except (BaseSSLError, OSError, SocketTimeout) as e:
                          self._raise_timeout(
                              err=e, url=self.proxy.url, timeout_value=conn.timeout
                          )
                          raise
      
                  # If we're going to release the connection in ``finally:``, then
                  # the response doesn't need to know about the connection. Otherwise
                  # it will also try to release it and we'll have a double-release
                  # mess.
                  response_conn = conn if not release_conn else None
      
                  # Make the request on the HTTPConnection object
      >           response = self._make_request(
                      conn,
                      method,
                      url,
                      timeout=timeout_obj,
                      body=body,
                      headers=headers,
                      chunked=chunked,
                      retries=retries,
                      response_conn=response_conn,
                      preload_content=preload_content,
                      decode_content=decode_content,
                      **response_kw,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:789: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:495: in _make_request
          conn.request(
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:441: in request
          self.endheaders()
      .pixi/envs/default/lib/python3.8/http/client.py:1251: in endheaders
          self._send_output(message_body, encode_chunked=encode_chunked)
      .pixi/envs/default/lib/python3.8/http/client.py:1011: in _send_output
          self.send(msg)
      .pixi/envs/default/lib/python3.8/http/client.py:951: in send
          self.connect()
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:279: in connect
          self.sock = self._new_conn()
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <urllib3.connection.HTTPConnection object at 0x7fe1c5b63f40>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
                  sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
              except socket.gaierror as e:
                  raise NameResolutionError(self.host, self, e) from e
              except SocketTimeout as e:
                  raise ConnectTimeoutError(
                      self,
                      f"Connection to {self.host} timed out. (connect timeout={self.timeout})",
                  ) from e
      
              except OSError as e:
      >           raise NewConnectionError(
                      self, f"Failed to establish a new connection: {e}"
                  ) from e
      E           urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7fe1c5b63f40>: Failed to establish a new connection: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:214: NewConnectionError
      
      The above exception was the direct cause of the following exception:
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c5b63c10>
      request = <PreparedRequest [POST]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
      >           resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:667: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:843: in urlopen
          retries = retries.increment(
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      method = 'POST', url = '/demo/', response = None
      error = NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c5b63f40>: Failed to establish a new connection: [Errno 111] Connection refused')
      _pool = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c5b63910>
      _stacktrace = <traceback object at 0x7fe1c4acf700>
      
          def increment(
              self,
              method: str | None = None,
              url: str | None = None,
              response: BaseHTTPResponse | None = None,
              error: Exception | None = None,
              _pool: ConnectionPool | None = None,
              _stacktrace: TracebackType | None = None,
          ) -> Self:
              """Return a new Retry object with incremented retry counters.
      
              :param response: A response object, or None, if the server did not
                  return a response.
              :type response: :class:`~urllib3.response.BaseHTTPResponse`
              :param Exception error: An error encountered during the request, or
                  None if the response was received successfully.
      
              :return: A new ``Retry`` object.
              """
              if self.total is False and error:
                  # Disabled, indicate to re-raise the error.
                  raise reraise(type(error), error, _stacktrace)
      
              total = self.total
              if total is not None:
                  total -= 1
      
              connect = self.connect
              read = self.read
              redirect = self.redirect
              status_count = self.status
              other = self.other
              cause = "unknown"
              status = None
              redirect_location = None
      
              if error and self._is_connection_error(error):
                  # Connect retry?
                  if connect is False:
                      raise reraise(type(error), error, _stacktrace)
                  elif connect is not None:
                      connect -= 1
      
              elif error and self._is_read_error(error):
                  # Read retry?
                  if read is False or method is None or not self._is_method_retryable(method):
                      raise reraise(type(error), error, _stacktrace)
                  elif read is not None:
                      read -= 1
      
              elif error:
                  # Other retry?
                  if other is not None:
                      other -= 1
      
              elif response and response.get_redirect_location():
                  # Redirect retry?
                  if redirect is not None:
                      redirect -= 1
                  cause = "too many redirects"
                  response_redirect_location = response.get_redirect_location()
                  if response_redirect_location:
                      redirect_location = response_redirect_location
                  status = response.status
      
              else:
                  # Incrementing because of a server error like a 500 in
                  # status_forcelist and the given method is in the allowed_methods
                  cause = ResponseError.GENERIC_ERROR
                  if response and response.status:
                      if status_count is not None:
                          status_count -= 1
                      cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status)
                      status = response.status
      
              history = self.history + (
                  RequestHistory(method, url, error, status, redirect_location),
              )
      
              new_retry = self.new(
                  total=total,
                  connect=connect,
                  read=read,
                  redirect=redirect,
                  status=status_count,
                  other=other,
                  history=history,
              )
      
              if new_retry.is_exhausted():
                  reason = error or ResponseError(cause)
      >           raise MaxRetryError(_pool, url, reason) from reason  # type: ignore[arg-type]
      E           urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c5b63f40>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/retry.py:519: MaxRetryError
      
      During handling of the above exception, another exception occurred:
      
      self = <elog.logbook.Logbook object at 0x7fe1c5b634c0>
      message = 'This is a message3', msg_id = None, reply = False
      attributes = {'Author': 'robot', 'When': 1756165751, 'cmd': 'Submit', 'exp': 'demo', ...}
      attachments = [], suppress_email_notification = False, encoding = None
      timeout = None, kwargs = {'Author': 'robot'}
      new_attachment_list = [('Text', ('', b'This is a message3'))]
      objects_to_close = []
      attributes_to_edit = {'Author': b'robot', 'When': 1756165751, 'cmd': b'Submit', 'exp': b'demo', ...}
      
          def post(self, message, msg_id=None, reply=False, attributes=None, attachments=None,
                   suppress_email_notification=False, encoding=None, timeout=None, **kwargs):
              """
              Posts message to the logbook. If msg_id is not specified new message will be created, otherwise existing
              message will be edited, or a reply (if reply=True) to it will be created. This method returns the msg_id
              of the newly created message.
      
              :param message: string with message text
              :param msg_id: ID number of message to edit or reply. If not specified new message is created.
              :param reply: If 'True' reply to existing message is created instead of editing it
              :param attributes: Dictionary of attributes. Following attributes are used internally by the elog and will be
                                 ignored: Text, Date, Encoding, Reply to, In reply to, Locked by, Attachment
              :param attachments: list of:
                                        - file like objects which read() will return bytes (if file_like_object.name is not
                                          defined, default name "attachment<i>" will be used.
                                        - paths to the files
                                  All items will be appended as attachment to the elog entry. In case of unknown
                                  attachment an exception LogbookInvalidAttachment will be raised.
              :param suppress_email_notification: If set to True or 1, E-Mail notification will be suppressed, defaults to False.
              :param encoding: Defines encoding of the message. Can be: 'plain' -> plain text, 'html'->html-text,
                               'ELCode' --> elog formatting syntax
              :param timeout: Define the timeout to be used by the post request. Its value is directly passed to the requests
                              post. Use None to disable the request timeout.
              :param kwargs: Anything in the kwargs will be interpreted as attribute. e.g.: logbook.post('Test text',
                             Author='Rok Vintar), "Author" will be sent as an attribute. If named same as one of the
                             attributes defined in "attributes", kwargs will have priority.
      
              :return: msg_id
              """
      
              attributes = attributes or {}
              attributes = {**attributes, **kwargs}  # kwargs as attributes with higher priority
      
              attachments = attachments or []
      
              if encoding is not None:
                  if encoding not in ['plain', 'HTML', 'ELCode']:
                      raise LogbookMessageRejected('Invalid message encoding. Valid options: plain, HTML, ELCode.')
                  attributes['Encoding'] = encoding
      
              if suppress_email_notification:
                  attributes["suppress"] = 1
      
              # THE ATTACHMENT STRATEGY WHEN DEALING WITH POST MODIFICATION
              #
              # 1. Does the message on the server have already attachments?
              #    1.1 - We read the message getting the existing attachment list.
              #    1.2 - Add to the attributes dictionary one line for each attachment like this:
              #       attributes['attachmentN'] = timestamped_filename_name
              #
              # 2. Do we have new attachments?
              #    2.1 - Those are in the new_attachment_list. This is a list of this type:
              #       [ ('attfileN', ('filename', fileobject)) ]
              #    2.2 - We need to loop over all the new attachments:
              #       2.2.1 - Does a file already on the server with the same name exist?
              #         2.2.1.1 - No: OK. Then we go ahead with the next attachment.
              #         2.2.1.2 - Yes:
              #           2.2.1.2.1 - Are the two files identical?
              #               2.2.1.2.1.1 - Yes: then we remove this current entry from the new_attachment_list and we leave the one
              #                      already on server.
              #               2.2.1.2.1.2 - No:
              #                  2.2.1.2.1.2.1 - Then the file has been update.
              #                  2.2.1.2.1.2.2 - We need to remove the file on server first (using special post)
              #                  2.2.1.2.1.2.3 - We have to remove the old attachment from the attributes dictionary.
              #
      
              if attachments:
                  # here we accomplish point 2.1.
                  # new_attachment_list is something like [ ('attfileN', ('filename', fileobject)) ]
                  new_attachment_list, objects_to_close = self._prepare_attachments(attachments)
              else:
                  objects_to_close = list()
                  new_attachment_list = list()
      
              attributes_to_edit = dict()
              if msg_id:
                  # Message exists, we can continue
                  if reply:
                      # Verify that there is a message on the server, otherwise do not reply to it!
                      self._check_if_message_on_server(msg_id)  # raises exception in case of none existing message
                      attributes['reply_to'] = str(msg_id)
                  else:  # Edit existing
                      attributes['edit_id'] = str(msg_id)
                      attributes['skiplock'] = '1'
      
                      # here we accomplish point 1.1.
                      # existing_attachments_list is something like:
                      # [ 'https://elog.url.com/logbook/timestamped_filename' ]
                      msg_to_edit, attributes_to_edit, existing_attachments_list = self.read(msg_id)
      
                      for attribute, data in attributes.items():
                          new_data = attributes.get(attribute)
                          if new_data is not None:
                              attributes_to_edit[attribute] = new_data
      
                      i = 0
                      existing_attachments_filename_list = list()
                      for attachment in existing_attachments_list:
                          # here we accomplish point 1.2. We strip the timestamped_filename from the whole URL.
                          attributes_to_edit[f'attachment{i}'] = os.path.basename(attachment)
                          existing_attachments_filename_list.append(os.path.basename(attachment)[14:])
                          i += 1
      
                      # let's accomplish 2.2. Loop over all new attachment
                      duplicate_attachment_list = list()
                      for new_attachment in new_attachment_list:
                          # the new_attachment_list is something like:
                          # [ ('attfileN', ('filename', fileobject)) ]
                          new_attachment_filename = new_attachment[1][0]
                          if new_attachment_filename in existing_attachments_filename_list:
                              # a file with the same name existing already on the server.
                              # we need to check if the two files are the same.
                              # read the content of the new file
                              new_attachment_content = new_attachment[1][1].read()
                              # don't forget to reset the fileobj to the beginning of the file
                              new_attachment[1][1].seek(0)
                              # get the existing attachment content
                              attachment_index = existing_attachments_filename_list.index(new_attachment_filename)
                              existing_attachment_content = self.download_attachment(
                                  url=existing_attachments_list[attachment_index],
                                  timeout=timeout
                              )
                              # check if the two contents are the same
                              if new_attachment_content == existing_attachment_content:
                                  # yes. then we don't upload a second copy. we remove the current entry from the list
                                  duplicate_attachment_list.append(new_attachment)
                              else:
                                  # no. they are not the same file. we will replace the existing file with the new one
                                  # first: we need to remove the attachment from the server using the dedicated method
                                  self.delete_attachment(msg_id, attributes=attributes_to_edit,
                                                         attachment_id=attachment_index,
                                                         timeout=timeout, text=msg_to_edit)
                                  # now we can remove this attachment from the auxiliary lists.
                                  existing_attachments_filename_list.pop(attachment_index)
                                  existing_attachments_list.pop(attachment_index)
                                  # now we need to rebuild the attributes dictionary for the part concerning the attachments.
                                  # we remove all of them first
                                  keys_to_be_removed = list()
                                  for key in attributes_to_edit.keys():
                                      if key.startswith('attachment'):
                                          keys_to_be_removed.append(key)
                                      if key.startswith('delatt'):
                                          keys_to_be_removed.append(key)
                                  for key in keys_to_be_removed:
                                      del attributes_to_edit[key]
      
                                  # now we rebuild it
                                  for i, attachment in enumerate(existing_attachments_list):
                                      attributes_to_edit[f'attachment{i}'] = os.path.basename(attachment)
      
                      # remove all duplicate attachments from the new_attachment_list
                      for attach in duplicate_attachment_list:
                          new_attachment_list.remove(attach)
      
              else:
                  # As we create a new message, specify creation time if not already specified in attributes
                  if 'When' not in attributes:
                      attributes['When'] = int(datetime.now().timestamp())
      
              if not attributes_to_edit:
                  attributes_to_edit = attributes
      
              # Remove any attributes that should not be sent
              _remove_reserved_attributes(attributes_to_edit)
      
              # Make requests module think that Text is a "file". This is the only way to force requests to send data as
              # multipart/form-data even if there are no attachments. Elog understands only multipart/form-data
              new_attachment_list.append(('Text', ('', message.encode('iso-8859-1'))))
      
              # Base attributes are common to all messages
              self._add_base_msg_attributes(attributes_to_edit)
      
              # Keys in attributes cannot have certain characters like whitespaces or dashes for the http request
              attributes_to_edit = _replace_special_characters_in_attribute_keys(attributes_to_edit)
      
              # All string values in the attributes must be encoded in latin1
              attributes_to_edit = _encode_values(attributes_to_edit)
      
              try:
      >           response = requests.post(self._url, data=attributes_to_edit, files=new_attachment_list,
                                           allow_redirects=False, verify=False, timeout=timeout)
      
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:288: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:115: in post
          return request("post", url, data=data, json=json, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:59: in request
          return session.request(method=method, url=url, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:589: in request
          resp = self.send(prep, **send_kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:703: in send
          r = adapter.send(request, **kwargs)
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c5b63c10>
      request = <PreparedRequest [POST]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
                  resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
              except (ProtocolError, OSError) as err:
                  raise ConnectionError(err, request=request)
      
              except MaxRetryError as e:
                  if isinstance(e.reason, ConnectTimeoutError):
                      # TODO: Remove this in 3.0.0: see #2811
                      if not isinstance(e.reason, NewConnectionError):
                          raise ConnectTimeout(e, request=request)
      
                  if isinstance(e.reason, ResponseError):
                      raise RetryError(e, request=request)
      
                  if isinstance(e.reason, _ProxyError):
                      raise ProxyError(e, request=request)
      
                  if isinstance(e.reason, _SSLError):
                      # This branch is for urllib3 v1.22 and later.
                      raise SSLError(e, request=request)
      
      >           raise ConnectionError(e, request=request)
      E           requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c5b63f40>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:700: ConnectionError
      
      During handling of the above exception, another exception occurred:
      
      self = <urllib3.connection.HTTPConnection object at 0x7fe1c5a98130>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
      >           sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:199: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:85: in create_connection
          raise err
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      address = ('localhost', 8080), timeout = None, source_address = None
      socket_options = [(6, 1, 1)]
      
          def create_connection(
              address: tuple[str, int],
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              source_address: tuple[str, int] | None = None,
              socket_options: _TYPE_SOCKET_OPTIONS | None = None,
          ) -> socket.socket:
              """Connect to *address* and return the socket object.
      
              Convenience function.  Connect to *address* (a 2-tuple ``(host,
              port)``) and return the socket object.  Passing the optional
              *timeout* parameter will set the timeout on the socket instance
              before attempting to connect.  If no *timeout* is supplied, the
              global default timeout setting returned by :func:`socket.getdefaulttimeout`
              is used.  If *source_address* is set it must be a tuple of (host, port)
              for the socket to bind as a source address before making the connection.
              An host of '' or port 0 tells the OS to use the default.
              """
      
              host, port = address
              if host.startswith("["):
                  host = host.strip("[]")
              err = None
      
              # Using the value from allowed_gai_family() in the context of getaddrinfo lets
              # us select whether to work with IPv4 DNS records, IPv6 records, or both.
              # The original create_connection function always returns all records.
              family = allowed_gai_family()
      
              try:
                  host.encode("idna")
              except UnicodeError:
                  raise LocationParseError(f"'{host}', label empty or too long") from None
      
              for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
                  af, socktype, proto, canonname, sa = res
                  sock = None
                  try:
                      sock = socket.socket(af, socktype, proto)
      
                      # If provided, set socket level options before connecting.
                      _set_socket_options(sock, socket_options)
      
                      if timeout is not _DEFAULT_TIMEOUT:
                          sock.settimeout(timeout)
                      if source_address:
                          sock.bind(source_address)
      >               sock.connect(sa)
      E               ConnectionRefusedError: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:73: ConnectionRefusedError
      
      The above exception was the direct cause of the following exception:
      
      self = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c5a98370>
      method = 'GET', url = '/demo/None', body = None
      headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'unm=robot;upwd=me1T.2jUUqQNa1wNuey9zNBOmOa4eILOaPb.ZSZjpn4;'}
      retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      redirect = False, assert_same_host = False
      timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
      release_conn = False, chunked = False, body_pos = None, preload_content = False
      decode_content = False, response_kw = {}
      parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/demo/None', query=None, fragment=None)
      destination_scheme = None, conn = None, release_this_conn = True
      http_tunnel_required = False, err = None, clean_exit = False
      
          def urlopen(  # type: ignore[override]
              self,
              method: str,
              url: str,
              body: _TYPE_BODY | None = None,
              headers: typing.Mapping[str, str] | None = None,
              retries: Retry | bool | int | None = None,
              redirect: bool = True,
              assert_same_host: bool = True,
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              pool_timeout: int | None = None,
              release_conn: bool | None = None,
              chunked: bool = False,
              body_pos: _TYPE_BODY_POSITION | None = None,
              preload_content: bool = True,
              decode_content: bool = True,
              **response_kw: typing.Any,
          ) -> BaseHTTPResponse:
              """
              Get a connection from the pool and perform an HTTP request. This is the
              lowest level call for making a request, so you'll need to specify all
              the raw details.
      
              .. note::
      
                 More commonly, it's appropriate to use a convenience method
                 such as :meth:`request`.
      
              .. note::
      
                 `release_conn` will only behave as expected if
                 `preload_content=False` because we want to make
                 `preload_content=False` the default behaviour someday soon without
                 breaking backwards compatibility.
      
              :param method:
                  HTTP request method (such as GET, POST, PUT, etc.)
      
              :param url:
                  The URL to perform the request on.
      
              :param body:
                  Data to send in the request body, either :class:`str`, :class:`bytes`,
                  an iterable of :class:`str`/:class:`bytes`, or a file-like object.
      
              :param headers:
                  Dictionary of custom headers to send, such as User-Agent,
                  If-None-Match, etc. If None, pool headers are used. If provided,
                  these headers completely replace any pool-specific headers.
      
              :param retries:
                  Configure the number of retries to allow before raising a
                  :class:`~urllib3.exceptions.MaxRetryError` exception.
      
                  If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
                  :class:`~urllib3.util.retry.Retry` object for fine-grained control
                  over different types of retries.
                  Pass an integer number to retry connection errors that many times,
                  but no other types of errors. Pass zero to never retry.
      
                  If ``False``, then retries are disabled and any exception is raised
                  immediately. Also, instead of raising a MaxRetryError on redirects,
                  the redirect response will be returned.
      
              :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
      
              :param redirect:
                  If True, automatically handle redirects (status codes 301, 302,
                  303, 307, 308). Each redirect counts as a retry. Disabling retries
                  will disable redirect, too.
      
              :param assert_same_host:
                  If ``True``, will make sure that the host of the pool requests is
                  consistent else will raise HostChangedError. When ``False``, you can
                  use the pool on an HTTP proxy and request foreign hosts.
      
              :param timeout:
                  If specified, overrides the default timeout for this one
                  request. It may be a float (in seconds) or an instance of
                  :class:`urllib3.util.Timeout`.
      
              :param pool_timeout:
                  If set and the pool is set to block=True, then this method will
                  block for ``pool_timeout`` seconds and raise EmptyPoolError if no
                  connection is available within the time period.
      
              :param bool preload_content:
                  If True, the response's body will be preloaded into memory.
      
              :param bool decode_content:
                  If True, will attempt to decode the body based on the
                  'content-encoding' header.
      
              :param release_conn:
                  If False, then the urlopen call will not release the connection
                  back into the pool once a response is received (but will release if
                  you read the entire contents of the response such as when
                  `preload_content=True`). This is useful if you're not preloading
                  the response's content immediately. You will need to call
                  ``r.release_conn()`` on the response ``r`` to return the connection
                  back into the pool. If None, it takes the value of ``preload_content``
                  which defaults to ``True``.
      
              :param bool chunked:
                  If True, urllib3 will send the body using chunked transfer
                  encoding. Otherwise, urllib3 will send the body using the standard
                  content-length form. Defaults to False.
      
              :param int body_pos:
                  Position to seek to in file-like body in the event of a retry or
                  redirect. Typically this won't need to be set because urllib3 will
                  auto-populate the value when needed.
              """
              parsed_url = parse_url(url)
              destination_scheme = parsed_url.scheme
      
              if headers is None:
                  headers = self.headers
      
              if not isinstance(retries, Retry):
                  retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
      
              if release_conn is None:
                  release_conn = preload_content
      
              # Check host
              if assert_same_host and not self.is_same_host(url):
                  raise HostChangedError(self, url, retries)
      
              # Ensure that the URL we're connecting to is properly encoded
              if url.startswith("/"):
                  url = to_str(_encode_target(url))
              else:
                  url = to_str(parsed_url.url)
      
              conn = None
      
              # Track whether `conn` needs to be released before
              # returning/raising/recursing. Update this variable if necessary, and
              # leave `release_conn` constant throughout the function. That way, if
              # the function recurses, the original value of `release_conn` will be
              # passed down into the recursive call, and its value will be respected.
              #
              # See issue #651 [1] for details.
              #
              # [1] <https://github.com/urllib3/urllib3/issues/651>
              release_this_conn = release_conn
      
              http_tunnel_required = connection_requires_http_tunnel(
                  self.proxy, self.proxy_config, destination_scheme
              )
      
              # Merge the proxy headers. Only done when not using HTTP CONNECT. We
              # have to copy the headers dict so we can safely change it without those
              # changes being reflected in anyone else's copy.
              if not http_tunnel_required:
                  headers = headers.copy()  # type: ignore[attr-defined]
                  headers.update(self.proxy_headers)  # type: ignore[union-attr]
      
              # Must keep the exception bound to a separate variable or else Python 3
              # complains about UnboundLocalError.
              err = None
      
              # Keep track of whether we cleanly exited the except block. This
              # ensures we do proper cleanup in finally.
              clean_exit = False
      
              # Rewind body position, if needed. Record current position
              # for future rewinds in the event of a redirect/retry.
              body_pos = set_file_position(body, body_pos)
      
              try:
                  # Request a connection from the queue.
                  timeout_obj = self._get_timeout(timeout)
                  conn = self._get_conn(timeout=pool_timeout)
      
                  conn.timeout = timeout_obj.connect_timeout  # type: ignore[assignment]
      
                  # Is this a closed/new connection that requires CONNECT tunnelling?
                  if self.proxy is not None and http_tunnel_required and conn.is_closed:
                      try:
                          self._prepare_proxy(conn)
                      except (BaseSSLError, OSError, SocketTimeout) as e:
                          self._raise_timeout(
                              err=e, url=self.proxy.url, timeout_value=conn.timeout
                          )
                          raise
      
                  # If we're going to release the connection in ``finally:``, then
                  # the response doesn't need to know about the connection. Otherwise
                  # it will also try to release it and we'll have a double-release
                  # mess.
                  response_conn = conn if not release_conn else None
      
                  # Make the request on the HTTPConnection object
      >           response = self._make_request(
                      conn,
                      method,
                      url,
                      timeout=timeout_obj,
                      body=body,
                      headers=headers,
                      chunked=chunked,
                      retries=retries,
                      response_conn=response_conn,
                      preload_content=preload_content,
                      decode_content=decode_content,
                      **response_kw,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:789: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:495: in _make_request
          conn.request(
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:441: in request
          self.endheaders()
      .pixi/envs/default/lib/python3.8/http/client.py:1251: in endheaders
          self._send_output(message_body, encode_chunked=encode_chunked)
      .pixi/envs/default/lib/python3.8/http/client.py:1011: in _send_output
          self.send(msg)
      .pixi/envs/default/lib/python3.8/http/client.py:951: in send
          self.connect()
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:279: in connect
          self.sock = self._new_conn()
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <urllib3.connection.HTTPConnection object at 0x7fe1c5a98130>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
                  sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
              except socket.gaierror as e:
                  raise NameResolutionError(self.host, self, e) from e
              except SocketTimeout as e:
                  raise ConnectTimeoutError(
                      self,
                      f"Connection to {self.host} timed out. (connect timeout={self.timeout})",
                  ) from e
      
              except OSError as e:
      >           raise NewConnectionError(
                      self, f"Failed to establish a new connection: {e}"
                  ) from e
      E           urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7fe1c5a98130>: Failed to establish a new connection: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:214: NewConnectionError
      
      The above exception was the direct cause of the following exception:
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c5e35b50>
      request = <PreparedRequest [GET]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
      >           resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:667: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:843: in urlopen
          retries = retries.increment(
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      method = 'GET', url = '/demo/None', response = None
      error = NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c5a98130>: Failed to establish a new connection: [Errno 111] Connection refused')
      _pool = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c5a98370>
      _stacktrace = <traceback object at 0x7fe1c46b4a80>
      
          def increment(
              self,
              method: str | None = None,
              url: str | None = None,
              response: BaseHTTPResponse | None = None,
              error: Exception | None = None,
              _pool: ConnectionPool | None = None,
              _stacktrace: TracebackType | None = None,
          ) -> Self:
              """Return a new Retry object with incremented retry counters.
      
              :param response: A response object, or None, if the server did not
                  return a response.
              :type response: :class:`~urllib3.response.BaseHTTPResponse`
              :param Exception error: An error encountered during the request, or
                  None if the response was received successfully.
      
              :return: A new ``Retry`` object.
              """
              if self.total is False and error:
                  # Disabled, indicate to re-raise the error.
                  raise reraise(type(error), error, _stacktrace)
      
              total = self.total
              if total is not None:
                  total -= 1
      
              connect = self.connect
              read = self.read
              redirect = self.redirect
              status_count = self.status
              other = self.other
              cause = "unknown"
              status = None
              redirect_location = None
      
              if error and self._is_connection_error(error):
                  # Connect retry?
                  if connect is False:
                      raise reraise(type(error), error, _stacktrace)
                  elif connect is not None:
                      connect -= 1
      
              elif error and self._is_read_error(error):
                  # Read retry?
                  if read is False or method is None or not self._is_method_retryable(method):
                      raise reraise(type(error), error, _stacktrace)
                  elif read is not None:
                      read -= 1
      
              elif error:
                  # Other retry?
                  if other is not None:
                      other -= 1
      
              elif response and response.get_redirect_location():
                  # Redirect retry?
                  if redirect is not None:
                      redirect -= 1
                  cause = "too many redirects"
                  response_redirect_location = response.get_redirect_location()
                  if response_redirect_location:
                      redirect_location = response_redirect_location
                  status = response.status
      
              else:
                  # Incrementing because of a server error like a 500 in
                  # status_forcelist and the given method is in the allowed_methods
                  cause = ResponseError.GENERIC_ERROR
                  if response and response.status:
                      if status_count is not None:
                          status_count -= 1
                      cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status)
                      status = response.status
      
              history = self.history + (
                  RequestHistory(method, url, error, status, redirect_location),
              )
      
              new_retry = self.new(
                  total=total,
                  connect=connect,
                  read=read,
                  redirect=redirect,
                  status=status_count,
                  other=other,
                  history=history,
              )
      
              if new_retry.is_exhausted():
                  reason = error or ResponseError(cause)
      >           raise MaxRetryError(_pool, url, reason) from reason  # type: ignore[arg-type]
      E           urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c5a98130>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/retry.py:519: MaxRetryError
      
      During handling of the above exception, another exception occurred:
      
      self = <elog.logbook.Logbook object at 0x7fe1c5b634c0>, msg_id = None
      timeout = None
      
          def _check_if_message_on_server(self, msg_id, timeout=None):
              """Try to load page for specific message. If there is a html tag like <td class="errormsg"> then there is no
              such message.
      
              :param msg_id: ID of message to be checked
              :params timeout: The value of timeout to be passed to the get request
              :return:
              """
      
              request_headers = dict()
              if self._user or self._password:
                  request_headers['Cookie'] = self._make_user_and_pswd_cookie()
              try:
      >           response = requests.get(self._url + str(msg_id), headers=request_headers, allow_redirects=False,
                                          verify=False, timeout=timeout)
      
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:581: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:73: in get
          return request("get", url, params=params, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:59: in request
          return session.request(method=method, url=url, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:589: in request
          resp = self.send(prep, **send_kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:703: in send
          r = adapter.send(request, **kwargs)
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c5e35b50>
      request = <PreparedRequest [GET]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
                  resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
              except (ProtocolError, OSError) as err:
                  raise ConnectionError(err, request=request)
      
              except MaxRetryError as e:
                  if isinstance(e.reason, ConnectTimeoutError):
                      # TODO: Remove this in 3.0.0: see #2811
                      if not isinstance(e.reason, NewConnectionError):
                          raise ConnectTimeout(e, request=request)
      
                  if isinstance(e.reason, ResponseError):
                      raise RetryError(e, request=request)
      
                  if isinstance(e.reason, _ProxyError):
                      raise ProxyError(e, request=request)
      
                  if isinstance(e.reason, _SSLError):
                      # This branch is for urllib3 v1.22 and later.
                      raise SSLError(e, request=request)
      
      >           raise ConnectionError(e, request=request)
      E           requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c5a98130>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:700: ConnectionError
      
      During handling of the above exception, another exception occurred:
      
      mock_home = <MagicMock name='home' id='140607642494960'>
      mock_getuser = <MagicMock name='getuser' id='140607639728240'>
      mock_getpass = <MagicMock name='getpass' id='140607640387936'>
      
          @patch("slic.utils.elog.getpass")
          @patch("slic.utils.elog.getuser")
          @patch("slic.utils.elog.Path.home")
          def test_get_default_elog_with_path_home(mock_home, mock_getuser, mock_getpass):
              fake_user = "robot"
              fake_pw = "testpassword"
              mock_getuser.return_value = fake_user
              mock_getpass.return_value = fake_pw  # fallback safety
              text = "This is a message3"
              url = "http://localhost:8080/demo"
      
              tmp_home = Path("/tmp/fake_home_for_robot")
              tmp_home.mkdir(parents=True, exist_ok=True)
              pw_file = tmp_home / ".elog_psi"
              pw_file.write_text(fake_pw)
              mock_home.return_value = tmp_home
      
              try:
                  elog = Elog("http://localhost:8080/demo")
                  try:
      >               msg_id = elog.post(text)
      
      tests/test_utils_elog.py:90: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      slic/utils/elog.py:16: in post
          return self._log.post(*args, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:307: in post
          self._check_if_message_on_server(msg_id)  # raises exceptions if no message or no response from server
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <elog.logbook.Logbook object at 0x7fe1c5b634c0>, msg_id = None
      timeout = None
      
          def _check_if_message_on_server(self, msg_id, timeout=None):
              """Try to load page for specific message. If there is a html tag like <td class="errormsg"> then there is no
              such message.
      
              :param msg_id: ID of message to be checked
              :params timeout: The value of timeout to be passed to the get request
              :return:
              """
      
              request_headers = dict()
              if self._user or self._password:
                  request_headers['Cookie'] = self._make_user_and_pswd_cookie()
              try:
                  response = requests.get(self._url + str(msg_id), headers=request_headers, allow_redirects=False,
                                          verify=False, timeout=timeout)
      
                  # If there is no message code 200 will be returned (OK) and _validate_response will not recognise it
                  # but there will be some error in the html code.
                  resp_message, resp_headers, resp_msg_id = _validate_response(response)
                  # If there is no message, code 200 will be returned (OK) but there will be some error indication in
                  # the html code.
                  if re.findall('<td.*?class="errormsg".*?>.*?</td>',
                                resp_message.decode('utf-8', 'ignore'),
                                flags=re.DOTALL):
                      raise LogbookInvalidMessageID('Message with ID: ' + str(msg_id) + ' does not exist on logbook.')
      
              except requests.Timeout as e:
                  # Catch here a timeout o the post request.
                  # Raise the logbook exception and let the user handle it
                  raise LogbookServerTimeout('{0} method cannot be completed because of a network timeout:\n' +
                                             '{1}'.format(sys._getframe().f_code.co_name, e))
      
              except requests.RequestException as e:
      >           raise LogbookServerProblem('No response from the logbook server.\nDetails: ' + '{0}'.format(e))
      E           elog.logbook_exceptions.LogbookServerProblem: No response from the logbook server.
      E           Details: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c5a98130>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:601: LogbookServerProblem
      
      During handling of the above exception, another exception occurred:
      
      mock_home = <MagicMock name='home' id='140607642494960'>
      mock_getuser = <MagicMock name='getuser' id='140607639728240'>
      mock_getpass = <MagicMock name='getpass' id='140607640387936'>
      
          @patch("slic.utils.elog.getpass")
          @patch("slic.utils.elog.getuser")
          @patch("slic.utils.elog.Path.home")
          def test_get_default_elog_with_path_home(mock_home, mock_getuser, mock_getpass):
              fake_user = "robot"
              fake_pw = "testpassword"
              mock_getuser.return_value = fake_user
              mock_getpass.return_value = fake_pw  # fallback safety
              text = "This is a message3"
              url = "http://localhost:8080/demo"
      
              tmp_home = Path("/tmp/fake_home_for_robot")
              tmp_home.mkdir(parents=True, exist_ok=True)
              pw_file = tmp_home / ".elog_psi"
              pw_file.write_text(fake_pw)
              mock_home.return_value = tmp_home
      
              try:
                  elog = Elog("http://localhost:8080/demo")
                  try:
                      msg_id = elog.post(text)
                  except Exception as e:
      >               pytest.fail(f"elog.post() raised an unexpected exception: {e}")
      E               Failed: elog.post() raised an unexpected exception: No response from the logbook server.
      E               Details: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c5a98130>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      tests/test_utils_elog.py:92: Failed
      

      📌 Teardown phase

      duration:

      0.00023672636598348618
      

      outcome:

      passed
      

    Function: test_screenshot

    • Test 181

      📌 Setup phase

      duration:

      0.00014035776257514954
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.009003087878227234
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py
      lineno: 601
      message: elog.logbook_exceptions.LogbookServerProblem: No response from the logbook server.
      Details: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4eda7c0>: Failed to establish a new connection: [Errno 111] Connection refused'))
      

      traceback:

      -   path: tests/test_utils_elog.py
        lineno: 116
        message: None
      -   path: slic/utils/elog.py
        lineno: 21
        message: in screenshot
      -   path: slic/utils/elog.py
        lineno: 16
        message: in post
      -   path: .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py
        lineno: 307
        message: in post
      -   path: .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py
        lineno: 601
        message: LogbookServerProblem
      

      longrepr:

      self = <urllib3.connection.HTTPConnection object at 0x7fe1c4eda8e0>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
      >           sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:199: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:85: in create_connection
          raise err
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      address = ('localhost', 8080), timeout = None, source_address = None
      socket_options = [(6, 1, 1)]
      
          def create_connection(
              address: tuple[str, int],
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              source_address: tuple[str, int] | None = None,
              socket_options: _TYPE_SOCKET_OPTIONS | None = None,
          ) -> socket.socket:
              """Connect to *address* and return the socket object.
      
              Convenience function.  Connect to *address* (a 2-tuple ``(host,
              port)``) and return the socket object.  Passing the optional
              *timeout* parameter will set the timeout on the socket instance
              before attempting to connect.  If no *timeout* is supplied, the
              global default timeout setting returned by :func:`socket.getdefaulttimeout`
              is used.  If *source_address* is set it must be a tuple of (host, port)
              for the socket to bind as a source address before making the connection.
              An host of '' or port 0 tells the OS to use the default.
              """
      
              host, port = address
              if host.startswith("["):
                  host = host.strip("[]")
              err = None
      
              # Using the value from allowed_gai_family() in the context of getaddrinfo lets
              # us select whether to work with IPv4 DNS records, IPv6 records, or both.
              # The original create_connection function always returns all records.
              family = allowed_gai_family()
      
              try:
                  host.encode("idna")
              except UnicodeError:
                  raise LocationParseError(f"'{host}', label empty or too long") from None
      
              for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
                  af, socktype, proto, canonname, sa = res
                  sock = None
                  try:
                      sock = socket.socket(af, socktype, proto)
      
                      # If provided, set socket level options before connecting.
                      _set_socket_options(sock, socket_options)
      
                      if timeout is not _DEFAULT_TIMEOUT:
                          sock.settimeout(timeout)
                      if source_address:
                          sock.bind(source_address)
      >               sock.connect(sa)
      E               ConnectionRefusedError: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:73: ConnectionRefusedError
      
      The above exception was the direct cause of the following exception:
      
      self = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c48f3610>
      method = 'POST', url = '/demo/'
      body = b'--f662c54fe4f00a8a5741849fe291959b\r\nContent-Disposition: form-data; name="Author"\r\n\r\nrobot\r\n--f662c54fe4f00a...-data; name="Text"; filename=""\r\n\r\nSCREENSHOT_INTEGRATION_TEST_MSG_456\r\n--f662c54fe4f00a8a5741849fe291959b--\r\n'
      headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '889', 'Content-Type': 'multipart/form-data; boundary=f662c54fe4f00a8a5741849fe291959b'}
      retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      redirect = False, assert_same_host = False
      timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
      release_conn = False, chunked = False, body_pos = None, preload_content = False
      decode_content = False, response_kw = {}
      parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/demo/', query=None, fragment=None)
      destination_scheme = None, conn = None, release_this_conn = True
      http_tunnel_required = False, err = None, clean_exit = False
      
          def urlopen(  # type: ignore[override]
              self,
              method: str,
              url: str,
              body: _TYPE_BODY | None = None,
              headers: typing.Mapping[str, str] | None = None,
              retries: Retry | bool | int | None = None,
              redirect: bool = True,
              assert_same_host: bool = True,
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              pool_timeout: int | None = None,
              release_conn: bool | None = None,
              chunked: bool = False,
              body_pos: _TYPE_BODY_POSITION | None = None,
              preload_content: bool = True,
              decode_content: bool = True,
              **response_kw: typing.Any,
          ) -> BaseHTTPResponse:
              """
              Get a connection from the pool and perform an HTTP request. This is the
              lowest level call for making a request, so you'll need to specify all
              the raw details.
      
              .. note::
      
                 More commonly, it's appropriate to use a convenience method
                 such as :meth:`request`.
      
              .. note::
      
                 `release_conn` will only behave as expected if
                 `preload_content=False` because we want to make
                 `preload_content=False` the default behaviour someday soon without
                 breaking backwards compatibility.
      
              :param method:
                  HTTP request method (such as GET, POST, PUT, etc.)
      
              :param url:
                  The URL to perform the request on.
      
              :param body:
                  Data to send in the request body, either :class:`str`, :class:`bytes`,
                  an iterable of :class:`str`/:class:`bytes`, or a file-like object.
      
              :param headers:
                  Dictionary of custom headers to send, such as User-Agent,
                  If-None-Match, etc. If None, pool headers are used. If provided,
                  these headers completely replace any pool-specific headers.
      
              :param retries:
                  Configure the number of retries to allow before raising a
                  :class:`~urllib3.exceptions.MaxRetryError` exception.
      
                  If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
                  :class:`~urllib3.util.retry.Retry` object for fine-grained control
                  over different types of retries.
                  Pass an integer number to retry connection errors that many times,
                  but no other types of errors. Pass zero to never retry.
      
                  If ``False``, then retries are disabled and any exception is raised
                  immediately. Also, instead of raising a MaxRetryError on redirects,
                  the redirect response will be returned.
      
              :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
      
              :param redirect:
                  If True, automatically handle redirects (status codes 301, 302,
                  303, 307, 308). Each redirect counts as a retry. Disabling retries
                  will disable redirect, too.
      
              :param assert_same_host:
                  If ``True``, will make sure that the host of the pool requests is
                  consistent else will raise HostChangedError. When ``False``, you can
                  use the pool on an HTTP proxy and request foreign hosts.
      
              :param timeout:
                  If specified, overrides the default timeout for this one
                  request. It may be a float (in seconds) or an instance of
                  :class:`urllib3.util.Timeout`.
      
              :param pool_timeout:
                  If set and the pool is set to block=True, then this method will
                  block for ``pool_timeout`` seconds and raise EmptyPoolError if no
                  connection is available within the time period.
      
              :param bool preload_content:
                  If True, the response's body will be preloaded into memory.
      
              :param bool decode_content:
                  If True, will attempt to decode the body based on the
                  'content-encoding' header.
      
              :param release_conn:
                  If False, then the urlopen call will not release the connection
                  back into the pool once a response is received (but will release if
                  you read the entire contents of the response such as when
                  `preload_content=True`). This is useful if you're not preloading
                  the response's content immediately. You will need to call
                  ``r.release_conn()`` on the response ``r`` to return the connection
                  back into the pool. If None, it takes the value of ``preload_content``
                  which defaults to ``True``.
      
              :param bool chunked:
                  If True, urllib3 will send the body using chunked transfer
                  encoding. Otherwise, urllib3 will send the body using the standard
                  content-length form. Defaults to False.
      
              :param int body_pos:
                  Position to seek to in file-like body in the event of a retry or
                  redirect. Typically this won't need to be set because urllib3 will
                  auto-populate the value when needed.
              """
              parsed_url = parse_url(url)
              destination_scheme = parsed_url.scheme
      
              if headers is None:
                  headers = self.headers
      
              if not isinstance(retries, Retry):
                  retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
      
              if release_conn is None:
                  release_conn = preload_content
      
              # Check host
              if assert_same_host and not self.is_same_host(url):
                  raise HostChangedError(self, url, retries)
      
              # Ensure that the URL we're connecting to is properly encoded
              if url.startswith("/"):
                  url = to_str(_encode_target(url))
              else:
                  url = to_str(parsed_url.url)
      
              conn = None
      
              # Track whether `conn` needs to be released before
              # returning/raising/recursing. Update this variable if necessary, and
              # leave `release_conn` constant throughout the function. That way, if
              # the function recurses, the original value of `release_conn` will be
              # passed down into the recursive call, and its value will be respected.
              #
              # See issue #651 [1] for details.
              #
              # [1] <https://github.com/urllib3/urllib3/issues/651>
              release_this_conn = release_conn
      
              http_tunnel_required = connection_requires_http_tunnel(
                  self.proxy, self.proxy_config, destination_scheme
              )
      
              # Merge the proxy headers. Only done when not using HTTP CONNECT. We
              # have to copy the headers dict so we can safely change it without those
              # changes being reflected in anyone else's copy.
              if not http_tunnel_required:
                  headers = headers.copy()  # type: ignore[attr-defined]
                  headers.update(self.proxy_headers)  # type: ignore[union-attr]
      
              # Must keep the exception bound to a separate variable or else Python 3
              # complains about UnboundLocalError.
              err = None
      
              # Keep track of whether we cleanly exited the except block. This
              # ensures we do proper cleanup in finally.
              clean_exit = False
      
              # Rewind body position, if needed. Record current position
              # for future rewinds in the event of a redirect/retry.
              body_pos = set_file_position(body, body_pos)
      
              try:
                  # Request a connection from the queue.
                  timeout_obj = self._get_timeout(timeout)
                  conn = self._get_conn(timeout=pool_timeout)
      
                  conn.timeout = timeout_obj.connect_timeout  # type: ignore[assignment]
      
                  # Is this a closed/new connection that requires CONNECT tunnelling?
                  if self.proxy is not None and http_tunnel_required and conn.is_closed:
                      try:
                          self._prepare_proxy(conn)
                      except (BaseSSLError, OSError, SocketTimeout) as e:
                          self._raise_timeout(
                              err=e, url=self.proxy.url, timeout_value=conn.timeout
                          )
                          raise
      
                  # If we're going to release the connection in ``finally:``, then
                  # the response doesn't need to know about the connection. Otherwise
                  # it will also try to release it and we'll have a double-release
                  # mess.
                  response_conn = conn if not release_conn else None
      
                  # Make the request on the HTTPConnection object
      >           response = self._make_request(
                      conn,
                      method,
                      url,
                      timeout=timeout_obj,
                      body=body,
                      headers=headers,
                      chunked=chunked,
                      retries=retries,
                      response_conn=response_conn,
                      preload_content=preload_content,
                      decode_content=decode_content,
                      **response_kw,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:789: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:495: in _make_request
          conn.request(
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:441: in request
          self.endheaders()
      .pixi/envs/default/lib/python3.8/http/client.py:1251: in endheaders
          self._send_output(message_body, encode_chunked=encode_chunked)
      .pixi/envs/default/lib/python3.8/http/client.py:1011: in _send_output
          self.send(msg)
      .pixi/envs/default/lib/python3.8/http/client.py:951: in send
          self.connect()
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:279: in connect
          self.sock = self._new_conn()
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <urllib3.connection.HTTPConnection object at 0x7fe1c4eda8e0>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
                  sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
              except socket.gaierror as e:
                  raise NameResolutionError(self.host, self, e) from e
              except SocketTimeout as e:
                  raise ConnectTimeoutError(
                      self,
                      f"Connection to {self.host} timed out. (connect timeout={self.timeout})",
                  ) from e
      
              except OSError as e:
      >           raise NewConnectionError(
                      self, f"Failed to establish a new connection: {e}"
                  ) from e
      E           urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7fe1c4eda8e0>: Failed to establish a new connection: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:214: NewConnectionError
      
      The above exception was the direct cause of the following exception:
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c48f3cd0>
      request = <PreparedRequest [POST]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
      >           resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:667: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:843: in urlopen
          retries = retries.increment(
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      method = 'POST', url = '/demo/', response = None
      error = NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4eda8e0>: Failed to establish a new connection: [Errno 111] Connection refused')
      _pool = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c48f3610>
      _stacktrace = <traceback object at 0x7fe21976f580>
      
          def increment(
              self,
              method: str | None = None,
              url: str | None = None,
              response: BaseHTTPResponse | None = None,
              error: Exception | None = None,
              _pool: ConnectionPool | None = None,
              _stacktrace: TracebackType | None = None,
          ) -> Self:
              """Return a new Retry object with incremented retry counters.
      
              :param response: A response object, or None, if the server did not
                  return a response.
              :type response: :class:`~urllib3.response.BaseHTTPResponse`
              :param Exception error: An error encountered during the request, or
                  None if the response was received successfully.
      
              :return: A new ``Retry`` object.
              """
              if self.total is False and error:
                  # Disabled, indicate to re-raise the error.
                  raise reraise(type(error), error, _stacktrace)
      
              total = self.total
              if total is not None:
                  total -= 1
      
              connect = self.connect
              read = self.read
              redirect = self.redirect
              status_count = self.status
              other = self.other
              cause = "unknown"
              status = None
              redirect_location = None
      
              if error and self._is_connection_error(error):
                  # Connect retry?
                  if connect is False:
                      raise reraise(type(error), error, _stacktrace)
                  elif connect is not None:
                      connect -= 1
      
              elif error and self._is_read_error(error):
                  # Read retry?
                  if read is False or method is None or not self._is_method_retryable(method):
                      raise reraise(type(error), error, _stacktrace)
                  elif read is not None:
                      read -= 1
      
              elif error:
                  # Other retry?
                  if other is not None:
                      other -= 1
      
              elif response and response.get_redirect_location():
                  # Redirect retry?
                  if redirect is not None:
                      redirect -= 1
                  cause = "too many redirects"
                  response_redirect_location = response.get_redirect_location()
                  if response_redirect_location:
                      redirect_location = response_redirect_location
                  status = response.status
      
              else:
                  # Incrementing because of a server error like a 500 in
                  # status_forcelist and the given method is in the allowed_methods
                  cause = ResponseError.GENERIC_ERROR
                  if response and response.status:
                      if status_count is not None:
                          status_count -= 1
                      cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status)
                      status = response.status
      
              history = self.history + (
                  RequestHistory(method, url, error, status, redirect_location),
              )
      
              new_retry = self.new(
                  total=total,
                  connect=connect,
                  read=read,
                  redirect=redirect,
                  status=status_count,
                  other=other,
                  history=history,
              )
      
              if new_retry.is_exhausted():
                  reason = error or ResponseError(cause)
      >           raise MaxRetryError(_pool, url, reason) from reason  # type: ignore[arg-type]
      E           urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4eda8e0>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/retry.py:519: MaxRetryError
      
      During handling of the above exception, another exception occurred:
      
      self = <elog.logbook.Logbook object at 0x7fe1c48f3280>
      message = 'SCREENSHOT_INTEGRATION_TEST_MSG_456', msg_id = None, reply = False
      attributes = {'Author': 'robot', 'When': 1756165751, 'cmd': 'Submit', 'exp': 'demo', ...}
      attachments = ['/tmp/fake_screenshot.png'], suppress_email_notification = False
      encoding = None, timeout = None, kwargs = {'Author': 'robot'}
      new_attachment_list = [('attfile0', ('fake_screenshot.png', <_io.BufferedReader name='/tmp/fake_screenshot.png'>)), ('Text', ('', b'SCREENSHOT_INTEGRATION_TEST_MSG_456'))]
      objects_to_close = [<_io.BufferedReader name='/tmp/fake_screenshot.png'>]
      attributes_to_edit = {'Author': b'robot', 'When': 1756165751, 'cmd': b'Submit', 'exp': b'demo', ...}
      
          def post(self, message, msg_id=None, reply=False, attributes=None, attachments=None,
                   suppress_email_notification=False, encoding=None, timeout=None, **kwargs):
              """
              Posts message to the logbook. If msg_id is not specified new message will be created, otherwise existing
              message will be edited, or a reply (if reply=True) to it will be created. This method returns the msg_id
              of the newly created message.
      
              :param message: string with message text
              :param msg_id: ID number of message to edit or reply. If not specified new message is created.
              :param reply: If 'True' reply to existing message is created instead of editing it
              :param attributes: Dictionary of attributes. Following attributes are used internally by the elog and will be
                                 ignored: Text, Date, Encoding, Reply to, In reply to, Locked by, Attachment
              :param attachments: list of:
                                        - file like objects which read() will return bytes (if file_like_object.name is not
                                          defined, default name "attachment<i>" will be used.
                                        - paths to the files
                                  All items will be appended as attachment to the elog entry. In case of unknown
                                  attachment an exception LogbookInvalidAttachment will be raised.
              :param suppress_email_notification: If set to True or 1, E-Mail notification will be suppressed, defaults to False.
              :param encoding: Defines encoding of the message. Can be: 'plain' -> plain text, 'html'->html-text,
                               'ELCode' --> elog formatting syntax
              :param timeout: Define the timeout to be used by the post request. Its value is directly passed to the requests
                              post. Use None to disable the request timeout.
              :param kwargs: Anything in the kwargs will be interpreted as attribute. e.g.: logbook.post('Test text',
                             Author='Rok Vintar), "Author" will be sent as an attribute. If named same as one of the
                             attributes defined in "attributes", kwargs will have priority.
      
              :return: msg_id
              """
      
              attributes = attributes or {}
              attributes = {**attributes, **kwargs}  # kwargs as attributes with higher priority
      
              attachments = attachments or []
      
              if encoding is not None:
                  if encoding not in ['plain', 'HTML', 'ELCode']:
                      raise LogbookMessageRejected('Invalid message encoding. Valid options: plain, HTML, ELCode.')
                  attributes['Encoding'] = encoding
      
              if suppress_email_notification:
                  attributes["suppress"] = 1
      
              # THE ATTACHMENT STRATEGY WHEN DEALING WITH POST MODIFICATION
              #
              # 1. Does the message on the server have already attachments?
              #    1.1 - We read the message getting the existing attachment list.
              #    1.2 - Add to the attributes dictionary one line for each attachment like this:
              #       attributes['attachmentN'] = timestamped_filename_name
              #
              # 2. Do we have new attachments?
              #    2.1 - Those are in the new_attachment_list. This is a list of this type:
              #       [ ('attfileN', ('filename', fileobject)) ]
              #    2.2 - We need to loop over all the new attachments:
              #       2.2.1 - Does a file already on the server with the same name exist?
              #         2.2.1.1 - No: OK. Then we go ahead with the next attachment.
              #         2.2.1.2 - Yes:
              #           2.2.1.2.1 - Are the two files identical?
              #               2.2.1.2.1.1 - Yes: then we remove this current entry from the new_attachment_list and we leave the one
              #                      already on server.
              #               2.2.1.2.1.2 - No:
              #                  2.2.1.2.1.2.1 - Then the file has been update.
              #                  2.2.1.2.1.2.2 - We need to remove the file on server first (using special post)
              #                  2.2.1.2.1.2.3 - We have to remove the old attachment from the attributes dictionary.
              #
      
              if attachments:
                  # here we accomplish point 2.1.
                  # new_attachment_list is something like [ ('attfileN', ('filename', fileobject)) ]
                  new_attachment_list, objects_to_close = self._prepare_attachments(attachments)
              else:
                  objects_to_close = list()
                  new_attachment_list = list()
      
              attributes_to_edit = dict()
              if msg_id:
                  # Message exists, we can continue
                  if reply:
                      # Verify that there is a message on the server, otherwise do not reply to it!
                      self._check_if_message_on_server(msg_id)  # raises exception in case of none existing message
                      attributes['reply_to'] = str(msg_id)
                  else:  # Edit existing
                      attributes['edit_id'] = str(msg_id)
                      attributes['skiplock'] = '1'
      
                      # here we accomplish point 1.1.
                      # existing_attachments_list is something like:
                      # [ 'https://elog.url.com/logbook/timestamped_filename' ]
                      msg_to_edit, attributes_to_edit, existing_attachments_list = self.read(msg_id)
      
                      for attribute, data in attributes.items():
                          new_data = attributes.get(attribute)
                          if new_data is not None:
                              attributes_to_edit[attribute] = new_data
      
                      i = 0
                      existing_attachments_filename_list = list()
                      for attachment in existing_attachments_list:
                          # here we accomplish point 1.2. We strip the timestamped_filename from the whole URL.
                          attributes_to_edit[f'attachment{i}'] = os.path.basename(attachment)
                          existing_attachments_filename_list.append(os.path.basename(attachment)[14:])
                          i += 1
      
                      # let's accomplish 2.2. Loop over all new attachment
                      duplicate_attachment_list = list()
                      for new_attachment in new_attachment_list:
                          # the new_attachment_list is something like:
                          # [ ('attfileN', ('filename', fileobject)) ]
                          new_attachment_filename = new_attachment[1][0]
                          if new_attachment_filename in existing_attachments_filename_list:
                              # a file with the same name existing already on the server.
                              # we need to check if the two files are the same.
                              # read the content of the new file
                              new_attachment_content = new_attachment[1][1].read()
                              # don't forget to reset the fileobj to the beginning of the file
                              new_attachment[1][1].seek(0)
                              # get the existing attachment content
                              attachment_index = existing_attachments_filename_list.index(new_attachment_filename)
                              existing_attachment_content = self.download_attachment(
                                  url=existing_attachments_list[attachment_index],
                                  timeout=timeout
                              )
                              # check if the two contents are the same
                              if new_attachment_content == existing_attachment_content:
                                  # yes. then we don't upload a second copy. we remove the current entry from the list
                                  duplicate_attachment_list.append(new_attachment)
                              else:
                                  # no. they are not the same file. we will replace the existing file with the new one
                                  # first: we need to remove the attachment from the server using the dedicated method
                                  self.delete_attachment(msg_id, attributes=attributes_to_edit,
                                                         attachment_id=attachment_index,
                                                         timeout=timeout, text=msg_to_edit)
                                  # now we can remove this attachment from the auxiliary lists.
                                  existing_attachments_filename_list.pop(attachment_index)
                                  existing_attachments_list.pop(attachment_index)
                                  # now we need to rebuild the attributes dictionary for the part concerning the attachments.
                                  # we remove all of them first
                                  keys_to_be_removed = list()
                                  for key in attributes_to_edit.keys():
                                      if key.startswith('attachment'):
                                          keys_to_be_removed.append(key)
                                      if key.startswith('delatt'):
                                          keys_to_be_removed.append(key)
                                  for key in keys_to_be_removed:
                                      del attributes_to_edit[key]
      
                                  # now we rebuild it
                                  for i, attachment in enumerate(existing_attachments_list):
                                      attributes_to_edit[f'attachment{i}'] = os.path.basename(attachment)
      
                      # remove all duplicate attachments from the new_attachment_list
                      for attach in duplicate_attachment_list:
                          new_attachment_list.remove(attach)
      
              else:
                  # As we create a new message, specify creation time if not already specified in attributes
                  if 'When' not in attributes:
                      attributes['When'] = int(datetime.now().timestamp())
      
              if not attributes_to_edit:
                  attributes_to_edit = attributes
      
              # Remove any attributes that should not be sent
              _remove_reserved_attributes(attributes_to_edit)
      
              # Make requests module think that Text is a "file". This is the only way to force requests to send data as
              # multipart/form-data even if there are no attachments. Elog understands only multipart/form-data
              new_attachment_list.append(('Text', ('', message.encode('iso-8859-1'))))
      
              # Base attributes are common to all messages
              self._add_base_msg_attributes(attributes_to_edit)
      
              # Keys in attributes cannot have certain characters like whitespaces or dashes for the http request
              attributes_to_edit = _replace_special_characters_in_attribute_keys(attributes_to_edit)
      
              # All string values in the attributes must be encoded in latin1
              attributes_to_edit = _encode_values(attributes_to_edit)
      
              try:
      >           response = requests.post(self._url, data=attributes_to_edit, files=new_attachment_list,
                                           allow_redirects=False, verify=False, timeout=timeout)
      
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:288: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:115: in post
          return request("post", url, data=data, json=json, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:59: in request
          return session.request(method=method, url=url, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:589: in request
          resp = self.send(prep, **send_kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:703: in send
          r = adapter.send(request, **kwargs)
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c48f3cd0>
      request = <PreparedRequest [POST]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
                  resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
              except (ProtocolError, OSError) as err:
                  raise ConnectionError(err, request=request)
      
              except MaxRetryError as e:
                  if isinstance(e.reason, ConnectTimeoutError):
                      # TODO: Remove this in 3.0.0: see #2811
                      if not isinstance(e.reason, NewConnectionError):
                          raise ConnectTimeout(e, request=request)
      
                  if isinstance(e.reason, ResponseError):
                      raise RetryError(e, request=request)
      
                  if isinstance(e.reason, _ProxyError):
                      raise ProxyError(e, request=request)
      
                  if isinstance(e.reason, _SSLError):
                      # This branch is for urllib3 v1.22 and later.
                      raise SSLError(e, request=request)
      
      >           raise ConnectionError(e, request=request)
      E           requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4eda8e0>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:700: ConnectionError
      
      During handling of the above exception, another exception occurred:
      
      self = <urllib3.connection.HTTPConnection object at 0x7fe1c4eda7c0>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
      >           sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:199: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:85: in create_connection
          raise err
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      address = ('localhost', 8080), timeout = None, source_address = None
      socket_options = [(6, 1, 1)]
      
          def create_connection(
              address: tuple[str, int],
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              source_address: tuple[str, int] | None = None,
              socket_options: _TYPE_SOCKET_OPTIONS | None = None,
          ) -> socket.socket:
              """Connect to *address* and return the socket object.
      
              Convenience function.  Connect to *address* (a 2-tuple ``(host,
              port)``) and return the socket object.  Passing the optional
              *timeout* parameter will set the timeout on the socket instance
              before attempting to connect.  If no *timeout* is supplied, the
              global default timeout setting returned by :func:`socket.getdefaulttimeout`
              is used.  If *source_address* is set it must be a tuple of (host, port)
              for the socket to bind as a source address before making the connection.
              An host of '' or port 0 tells the OS to use the default.
              """
      
              host, port = address
              if host.startswith("["):
                  host = host.strip("[]")
              err = None
      
              # Using the value from allowed_gai_family() in the context of getaddrinfo lets
              # us select whether to work with IPv4 DNS records, IPv6 records, or both.
              # The original create_connection function always returns all records.
              family = allowed_gai_family()
      
              try:
                  host.encode("idna")
              except UnicodeError:
                  raise LocationParseError(f"'{host}', label empty or too long") from None
      
              for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
                  af, socktype, proto, canonname, sa = res
                  sock = None
                  try:
                      sock = socket.socket(af, socktype, proto)
      
                      # If provided, set socket level options before connecting.
                      _set_socket_options(sock, socket_options)
      
                      if timeout is not _DEFAULT_TIMEOUT:
                          sock.settimeout(timeout)
                      if source_address:
                          sock.bind(source_address)
      >               sock.connect(sa)
      E               ConnectionRefusedError: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/connection.py:73: ConnectionRefusedError
      
      The above exception was the direct cause of the following exception:
      
      self = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c4eda070>
      method = 'GET', url = '/demo/None', body = None
      headers = {'User-Agent': 'python-requests/2.32.3', 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'unm=robot;upwd=me1T.2jUUqQNa1wNuey9zNBOmOa4eILOaPb.ZSZjpn4;'}
      retries = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      redirect = False, assert_same_host = False
      timeout = Timeout(connect=None, read=None, total=None), pool_timeout = None
      release_conn = False, chunked = False, body_pos = None, preload_content = False
      decode_content = False, response_kw = {}
      parsed_url = Url(scheme=None, auth=None, host=None, port=None, path='/demo/None', query=None, fragment=None)
      destination_scheme = None, conn = None, release_this_conn = True
      http_tunnel_required = False, err = None, clean_exit = False
      
          def urlopen(  # type: ignore[override]
              self,
              method: str,
              url: str,
              body: _TYPE_BODY | None = None,
              headers: typing.Mapping[str, str] | None = None,
              retries: Retry | bool | int | None = None,
              redirect: bool = True,
              assert_same_host: bool = True,
              timeout: _TYPE_TIMEOUT = _DEFAULT_TIMEOUT,
              pool_timeout: int | None = None,
              release_conn: bool | None = None,
              chunked: bool = False,
              body_pos: _TYPE_BODY_POSITION | None = None,
              preload_content: bool = True,
              decode_content: bool = True,
              **response_kw: typing.Any,
          ) -> BaseHTTPResponse:
              """
              Get a connection from the pool and perform an HTTP request. This is the
              lowest level call for making a request, so you'll need to specify all
              the raw details.
      
              .. note::
      
                 More commonly, it's appropriate to use a convenience method
                 such as :meth:`request`.
      
              .. note::
      
                 `release_conn` will only behave as expected if
                 `preload_content=False` because we want to make
                 `preload_content=False` the default behaviour someday soon without
                 breaking backwards compatibility.
      
              :param method:
                  HTTP request method (such as GET, POST, PUT, etc.)
      
              :param url:
                  The URL to perform the request on.
      
              :param body:
                  Data to send in the request body, either :class:`str`, :class:`bytes`,
                  an iterable of :class:`str`/:class:`bytes`, or a file-like object.
      
              :param headers:
                  Dictionary of custom headers to send, such as User-Agent,
                  If-None-Match, etc. If None, pool headers are used. If provided,
                  these headers completely replace any pool-specific headers.
      
              :param retries:
                  Configure the number of retries to allow before raising a
                  :class:`~urllib3.exceptions.MaxRetryError` exception.
      
                  If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
                  :class:`~urllib3.util.retry.Retry` object for fine-grained control
                  over different types of retries.
                  Pass an integer number to retry connection errors that many times,
                  but no other types of errors. Pass zero to never retry.
      
                  If ``False``, then retries are disabled and any exception is raised
                  immediately. Also, instead of raising a MaxRetryError on redirects,
                  the redirect response will be returned.
      
              :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
      
              :param redirect:
                  If True, automatically handle redirects (status codes 301, 302,
                  303, 307, 308). Each redirect counts as a retry. Disabling retries
                  will disable redirect, too.
      
              :param assert_same_host:
                  If ``True``, will make sure that the host of the pool requests is
                  consistent else will raise HostChangedError. When ``False``, you can
                  use the pool on an HTTP proxy and request foreign hosts.
      
              :param timeout:
                  If specified, overrides the default timeout for this one
                  request. It may be a float (in seconds) or an instance of
                  :class:`urllib3.util.Timeout`.
      
              :param pool_timeout:
                  If set and the pool is set to block=True, then this method will
                  block for ``pool_timeout`` seconds and raise EmptyPoolError if no
                  connection is available within the time period.
      
              :param bool preload_content:
                  If True, the response's body will be preloaded into memory.
      
              :param bool decode_content:
                  If True, will attempt to decode the body based on the
                  'content-encoding' header.
      
              :param release_conn:
                  If False, then the urlopen call will not release the connection
                  back into the pool once a response is received (but will release if
                  you read the entire contents of the response such as when
                  `preload_content=True`). This is useful if you're not preloading
                  the response's content immediately. You will need to call
                  ``r.release_conn()`` on the response ``r`` to return the connection
                  back into the pool. If None, it takes the value of ``preload_content``
                  which defaults to ``True``.
      
              :param bool chunked:
                  If True, urllib3 will send the body using chunked transfer
                  encoding. Otherwise, urllib3 will send the body using the standard
                  content-length form. Defaults to False.
      
              :param int body_pos:
                  Position to seek to in file-like body in the event of a retry or
                  redirect. Typically this won't need to be set because urllib3 will
                  auto-populate the value when needed.
              """
              parsed_url = parse_url(url)
              destination_scheme = parsed_url.scheme
      
              if headers is None:
                  headers = self.headers
      
              if not isinstance(retries, Retry):
                  retries = Retry.from_int(retries, redirect=redirect, default=self.retries)
      
              if release_conn is None:
                  release_conn = preload_content
      
              # Check host
              if assert_same_host and not self.is_same_host(url):
                  raise HostChangedError(self, url, retries)
      
              # Ensure that the URL we're connecting to is properly encoded
              if url.startswith("/"):
                  url = to_str(_encode_target(url))
              else:
                  url = to_str(parsed_url.url)
      
              conn = None
      
              # Track whether `conn` needs to be released before
              # returning/raising/recursing. Update this variable if necessary, and
              # leave `release_conn` constant throughout the function. That way, if
              # the function recurses, the original value of `release_conn` will be
              # passed down into the recursive call, and its value will be respected.
              #
              # See issue #651 [1] for details.
              #
              # [1] <https://github.com/urllib3/urllib3/issues/651>
              release_this_conn = release_conn
      
              http_tunnel_required = connection_requires_http_tunnel(
                  self.proxy, self.proxy_config, destination_scheme
              )
      
              # Merge the proxy headers. Only done when not using HTTP CONNECT. We
              # have to copy the headers dict so we can safely change it without those
              # changes being reflected in anyone else's copy.
              if not http_tunnel_required:
                  headers = headers.copy()  # type: ignore[attr-defined]
                  headers.update(self.proxy_headers)  # type: ignore[union-attr]
      
              # Must keep the exception bound to a separate variable or else Python 3
              # complains about UnboundLocalError.
              err = None
      
              # Keep track of whether we cleanly exited the except block. This
              # ensures we do proper cleanup in finally.
              clean_exit = False
      
              # Rewind body position, if needed. Record current position
              # for future rewinds in the event of a redirect/retry.
              body_pos = set_file_position(body, body_pos)
      
              try:
                  # Request a connection from the queue.
                  timeout_obj = self._get_timeout(timeout)
                  conn = self._get_conn(timeout=pool_timeout)
      
                  conn.timeout = timeout_obj.connect_timeout  # type: ignore[assignment]
      
                  # Is this a closed/new connection that requires CONNECT tunnelling?
                  if self.proxy is not None and http_tunnel_required and conn.is_closed:
                      try:
                          self._prepare_proxy(conn)
                      except (BaseSSLError, OSError, SocketTimeout) as e:
                          self._raise_timeout(
                              err=e, url=self.proxy.url, timeout_value=conn.timeout
                          )
                          raise
      
                  # If we're going to release the connection in ``finally:``, then
                  # the response doesn't need to know about the connection. Otherwise
                  # it will also try to release it and we'll have a double-release
                  # mess.
                  response_conn = conn if not release_conn else None
      
                  # Make the request on the HTTPConnection object
      >           response = self._make_request(
                      conn,
                      method,
                      url,
                      timeout=timeout_obj,
                      body=body,
                      headers=headers,
                      chunked=chunked,
                      retries=retries,
                      response_conn=response_conn,
                      preload_content=preload_content,
                      decode_content=decode_content,
                      **response_kw,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:789: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:495: in _make_request
          conn.request(
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:441: in request
          self.endheaders()
      .pixi/envs/default/lib/python3.8/http/client.py:1251: in endheaders
          self._send_output(message_body, encode_chunked=encode_chunked)
      .pixi/envs/default/lib/python3.8/http/client.py:1011: in _send_output
          self.send(msg)
      .pixi/envs/default/lib/python3.8/http/client.py:951: in send
          self.connect()
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:279: in connect
          self.sock = self._new_conn()
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <urllib3.connection.HTTPConnection object at 0x7fe1c4eda7c0>
      
          def _new_conn(self) -> socket.socket:
              """Establish a socket connection and set nodelay settings on it.
      
              :return: New socket connection.
              """
              try:
                  sock = connection.create_connection(
                      (self._dns_host, self.port),
                      self.timeout,
                      source_address=self.source_address,
                      socket_options=self.socket_options,
                  )
              except socket.gaierror as e:
                  raise NameResolutionError(self.host, self, e) from e
              except SocketTimeout as e:
                  raise ConnectTimeoutError(
                      self,
                      f"Connection to {self.host} timed out. (connect timeout={self.timeout})",
                  ) from e
      
              except OSError as e:
      >           raise NewConnectionError(
                      self, f"Failed to establish a new connection: {e}"
                  ) from e
      E           urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x7fe1c4eda7c0>: Failed to establish a new connection: [Errno 111] Connection refused
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connection.py:214: NewConnectionError
      
      The above exception was the direct cause of the following exception:
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c4edad60>
      request = <PreparedRequest [GET]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
      >           resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:667: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/connectionpool.py:843: in urlopen
          retries = retries.increment(
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = Retry(total=0, connect=None, read=False, redirect=None, status=None)
      method = 'GET', url = '/demo/None', response = None
      error = NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4eda7c0>: Failed to establish a new connection: [Errno 111] Connection refused')
      _pool = <urllib3.connectionpool.HTTPConnectionPool object at 0x7fe1c4eda070>
      _stacktrace = <traceback object at 0x7fe1c5f87440>
      
          def increment(
              self,
              method: str | None = None,
              url: str | None = None,
              response: BaseHTTPResponse | None = None,
              error: Exception | None = None,
              _pool: ConnectionPool | None = None,
              _stacktrace: TracebackType | None = None,
          ) -> Self:
              """Return a new Retry object with incremented retry counters.
      
              :param response: A response object, or None, if the server did not
                  return a response.
              :type response: :class:`~urllib3.response.BaseHTTPResponse`
              :param Exception error: An error encountered during the request, or
                  None if the response was received successfully.
      
              :return: A new ``Retry`` object.
              """
              if self.total is False and error:
                  # Disabled, indicate to re-raise the error.
                  raise reraise(type(error), error, _stacktrace)
      
              total = self.total
              if total is not None:
                  total -= 1
      
              connect = self.connect
              read = self.read
              redirect = self.redirect
              status_count = self.status
              other = self.other
              cause = "unknown"
              status = None
              redirect_location = None
      
              if error and self._is_connection_error(error):
                  # Connect retry?
                  if connect is False:
                      raise reraise(type(error), error, _stacktrace)
                  elif connect is not None:
                      connect -= 1
      
              elif error and self._is_read_error(error):
                  # Read retry?
                  if read is False or method is None or not self._is_method_retryable(method):
                      raise reraise(type(error), error, _stacktrace)
                  elif read is not None:
                      read -= 1
      
              elif error:
                  # Other retry?
                  if other is not None:
                      other -= 1
      
              elif response and response.get_redirect_location():
                  # Redirect retry?
                  if redirect is not None:
                      redirect -= 1
                  cause = "too many redirects"
                  response_redirect_location = response.get_redirect_location()
                  if response_redirect_location:
                      redirect_location = response_redirect_location
                  status = response.status
      
              else:
                  # Incrementing because of a server error like a 500 in
                  # status_forcelist and the given method is in the allowed_methods
                  cause = ResponseError.GENERIC_ERROR
                  if response and response.status:
                      if status_count is not None:
                          status_count -= 1
                      cause = ResponseError.SPECIFIC_ERROR.format(status_code=response.status)
                      status = response.status
      
              history = self.history + (
                  RequestHistory(method, url, error, status, redirect_location),
              )
      
              new_retry = self.new(
                  total=total,
                  connect=connect,
                  read=read,
                  redirect=redirect,
                  status=status_count,
                  other=other,
                  history=history,
              )
      
              if new_retry.is_exhausted():
                  reason = error or ResponseError(cause)
      >           raise MaxRetryError(_pool, url, reason) from reason  # type: ignore[arg-type]
      E           urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4eda7c0>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/urllib3/util/retry.py:519: MaxRetryError
      
      During handling of the above exception, another exception occurred:
      
      self = <elog.logbook.Logbook object at 0x7fe1c48f3280>, msg_id = None
      timeout = None
      
          def _check_if_message_on_server(self, msg_id, timeout=None):
              """Try to load page for specific message. If there is a html tag like <td class="errormsg"> then there is no
              such message.
      
              :param msg_id: ID of message to be checked
              :params timeout: The value of timeout to be passed to the get request
              :return:
              """
      
              request_headers = dict()
              if self._user or self._password:
                  request_headers['Cookie'] = self._make_user_and_pswd_cookie()
              try:
      >           response = requests.get(self._url + str(msg_id), headers=request_headers, allow_redirects=False,
                                          verify=False, timeout=timeout)
      
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:581: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:73: in get
          return request("get", url, params=params, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/api.py:59: in request
          return session.request(method=method, url=url, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:589: in request
          resp = self.send(prep, **send_kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/requests/sessions.py:703: in send
          r = adapter.send(request, **kwargs)
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <requests.adapters.HTTPAdapter object at 0x7fe1c4edad60>
      request = <PreparedRequest [GET]>, stream = False
      timeout = Timeout(connect=None, read=None, total=None), verify = False
      cert = None, proxies = OrderedDict()
      
          def send(
              self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None
          ):
              """Sends PreparedRequest object. Returns Response object.
      
              :param request: The :class:`PreparedRequest <PreparedRequest>` being sent.
              :param stream: (optional) Whether to stream the request content.
              :param timeout: (optional) How long to wait for the server to send
                  data before giving up, as a float, or a :ref:`(connect timeout,
                  read timeout) <timeouts>` tuple.
              :type timeout: float or tuple or urllib3 Timeout object
              :param verify: (optional) Either a boolean, in which case it controls whether
                  we verify the server's TLS certificate, or a string, in which case it
                  must be a path to a CA bundle to use
              :param cert: (optional) Any user-provided SSL certificate to be trusted.
              :param proxies: (optional) The proxies dictionary to apply to the request.
              :rtype: requests.Response
              """
      
              try:
                  conn = self.get_connection_with_tls_context(
                      request, verify, proxies=proxies, cert=cert
                  )
              except LocationValueError as e:
                  raise InvalidURL(e, request=request)
      
              self.cert_verify(conn, request.url, verify, cert)
              url = self.request_url(request, proxies)
              self.add_headers(
                  request,
                  stream=stream,
                  timeout=timeout,
                  verify=verify,
                  cert=cert,
                  proxies=proxies,
              )
      
              chunked = not (request.body is None or "Content-Length" in request.headers)
      
              if isinstance(timeout, tuple):
                  try:
                      connect, read = timeout
                      timeout = TimeoutSauce(connect=connect, read=read)
                  except ValueError:
                      raise ValueError(
                          f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, "
                          f"or a single float to set both timeouts to the same value."
                      )
              elif isinstance(timeout, TimeoutSauce):
                  pass
              else:
                  timeout = TimeoutSauce(connect=timeout, read=timeout)
      
              try:
                  resp = conn.urlopen(
                      method=request.method,
                      url=url,
                      body=request.body,
                      headers=request.headers,
                      redirect=False,
                      assert_same_host=False,
                      preload_content=False,
                      decode_content=False,
                      retries=self.max_retries,
                      timeout=timeout,
                      chunked=chunked,
                  )
      
              except (ProtocolError, OSError) as err:
                  raise ConnectionError(err, request=request)
      
              except MaxRetryError as e:
                  if isinstance(e.reason, ConnectTimeoutError):
                      # TODO: Remove this in 3.0.0: see #2811
                      if not isinstance(e.reason, NewConnectionError):
                          raise ConnectTimeout(e, request=request)
      
                  if isinstance(e.reason, ResponseError):
                      raise RetryError(e, request=request)
      
                  if isinstance(e.reason, _ProxyError):
                      raise ProxyError(e, request=request)
      
                  if isinstance(e.reason, _SSLError):
                      # This branch is for urllib3 v1.22 and later.
                      raise SSLError(e, request=request)
      
      >           raise ConnectionError(e, request=request)
      E           requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4eda7c0>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/requests/adapters.py:700: ConnectionError
      
      During handling of the above exception, another exception occurred:
      
      mock_screenshot_class = <MagicMock name='Screenshot' id='140607640783792'>
      
          @patch("slic.utils.elog.Screenshot")
          def test_screenshot(mock_screenshot_class):
              fake_path = "/tmp/fake_screenshot.png"
              with open(fake_path, "wb") as f:
                  f.write(b"fake image data")
      
              mock_instance = mock_screenshot_class.return_value
              mock_instance.shoot.return_value = [fake_path]
      
              elog = Elog("http://localhost:8080/demo", user="robot", password="testpassword")
      
              test_msg = "SCREENSHOT_INTEGRATION_TEST_MSG_456"
      >       msg_id = elog.screenshot(message=test_msg)
      
      tests/test_utils_elog.py:116: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      slic/utils/elog.py:21: in screenshot
          return self.post(message, **kwargs)
      slic/utils/elog.py:16: in post
          return self._log.post(*args, **kwargs)
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:307: in post
          self._check_if_message_on_server(msg_id)  # raises exceptions if no message or no response from server
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <elog.logbook.Logbook object at 0x7fe1c48f3280>, msg_id = None
      timeout = None
      
          def _check_if_message_on_server(self, msg_id, timeout=None):
              """Try to load page for specific message. If there is a html tag like <td class="errormsg"> then there is no
              such message.
      
              :param msg_id: ID of message to be checked
              :params timeout: The value of timeout to be passed to the get request
              :return:
              """
      
              request_headers = dict()
              if self._user or self._password:
                  request_headers['Cookie'] = self._make_user_and_pswd_cookie()
              try:
                  response = requests.get(self._url + str(msg_id), headers=request_headers, allow_redirects=False,
                                          verify=False, timeout=timeout)
      
                  # If there is no message code 200 will be returned (OK) and _validate_response will not recognise it
                  # but there will be some error in the html code.
                  resp_message, resp_headers, resp_msg_id = _validate_response(response)
                  # If there is no message, code 200 will be returned (OK) but there will be some error indication in
                  # the html code.
                  if re.findall('<td.*?class="errormsg".*?>.*?</td>',
                                resp_message.decode('utf-8', 'ignore'),
                                flags=re.DOTALL):
                      raise LogbookInvalidMessageID('Message with ID: ' + str(msg_id) + ' does not exist on logbook.')
      
              except requests.Timeout as e:
                  # Catch here a timeout o the post request.
                  # Raise the logbook exception and let the user handle it
                  raise LogbookServerTimeout('{0} method cannot be completed because of a network timeout:\n' +
                                             '{1}'.format(sys._getframe().f_code.co_name, e))
      
              except requests.RequestException as e:
      >           raise LogbookServerProblem('No response from the logbook server.\nDetails: ' + '{0}'.format(e))
      E           elog.logbook_exceptions.LogbookServerProblem: No response from the logbook server.
      E           Details: HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /demo/None (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe1c4eda7c0>: Failed to establish a new connection: [Errno 111] Connection refused'))
      
      .pixi/envs/default/lib/python3.8/site-packages/elog/logbook.py:601: LogbookServerProblem
      

      📌 Teardown phase

      duration:

      0.0002475753426551819
      

      outcome:

      passed
      
  • 📄 test_utils_get_adj.py

    Function: test_get_adjs_filter

    • Test 233

      📌 Setup phase

      duration:

      0.00012211501598358154
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.001291867345571518
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_get_adj.py
      lineno: 42
      message: AssertionError: assert {'contrast', ...mid_contrast'} == {'brightness'...mid_contrast'}
      
        Extra items in the right set:
        'brightness'
      
        Full diff:
          {
        -     'brightness',
              'contrast',
              'mid_brightness',
              'mid_contrast',
          }
      

      traceback:

      -   path: tests/test_utils_get_adj.py
        lineno: 42
        message: AssertionError
      

      longrepr:

      def test_get_adjs_filter():
              a4 = SubAdjustable("mid_brightness",         units="%", limit_low=0,   limit_high=100)
              a5 = SubAdjustable("debug_internal",   internal=True)
              public = get_adjs()
      >       assert set(public) == {'brightness', 'contrast', 'mid_contrast', 'mid_brightness'}
      E       AssertionError: assert {'contrast', ...mid_contrast'} == {'brightness'...mid_contrast'}
      E         
      E         Extra items in the right set:
      E         'brightness'
      E         
      E         Full diff:
      E           {
      E         -     'brightness',
      E               'contrast',
      E               'mid_brightness',
      E               'mid_contrast',
      E           }
      
      tests/test_utils_get_adj.py:42: AssertionError
      

      📌 Teardown phase

      duration:

      0.0001407712697982788
      

      outcome:

      passed
      
  • 📄 test_utils_hastepics.py

    Function: test_get_pv_connect_false_and_true

    • Test 234

      📌 Setup phase

      duration:

      0.00027064327150583267
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      2.1041658837348223
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_hastepics.py
      lineno: 42
      message: AssertionError: assert False
       +  where False = <PV 'TEST:SIM:VAL': not connected>.connected
      

      traceback:

      -   path: tests/test_utils_hastepics.py
        lineno: 42
        message: AssertionError
      

      longrepr:

      def test_get_pv_connect_false_and_true():
              name = "TEST:SIM:VAL"
              assert not _in_pv_cache(name)
      
              pv = get_pv(name, connect=False)
              assert isinstance(pv, PV)
      
              assert _in_pv_cache(name), "PV should be in _PVcache_ after get_pv(connect=False)"
              assert not pv.connected
      
              # Now actually connect
              pv2 = get_pv(name, connect=True, timeout=2.0)
      >       assert pv2.connected
      E       AssertionError: assert False
      E        +  where False = <PV 'TEST:SIM:VAL': not connected>.connected
      
      tests/test_utils_hastepics.py:42: AssertionError
      

      📌 Teardown phase

      duration:

      0.0004103220999240875
      

      outcome:

      passed
      

    Function: test_motor_init_strips_suffixes

    • Test 235

      📌 Setup phase

      duration:

      0.0003426559269428253
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0023499466478824615
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_hastepics.py
      lineno: 66
      message: AssertionError: assert 'TEST:SIM:M1.' == 'TEST:SIM:M1'
      
        - TEST:SIM:M1
        + TEST:SIM:M1.
        ?            +
      

      traceback:

      -   path: tests/test_utils_hastepics.py
        lineno: 66
        message: AssertionError
      

      longrepr:

      def test_motor_init_strips_suffixes():
              m1 = Motor("TEST:SIM:M1.VAL")
      
              # Afficher les attributs de base de epics.Motor
              print("Attributes of epics.Motor:")
              print("  _init_list:", getattr(epics.Motor, "_init_list", []))
              print("  _extras:", getattr(epics.Motor, "_extras", {}))
      
              # Afficher les attributs de ton objet Motor
              print("\nAttributes of Motor (custom):")
              print("  _init_list:", getattr(m1, "_init_list", []))
              print("  _extras:", getattr(m1, "_extras", {}))
      
              # Afficher tous les attributs de epics.Motor (via dir())
              print("\nAll attributes of epics.Motor:")
              print(dir(epics.Motor))
      
              # Afficher tous les attributs de ta classe Motor (via dir())
              print("\nAll attributes of Motor (custom):")
              print(dir(m1))
      
      >       assert m1._prefix == "TEST:SIM:M1"
      E       AssertionError: assert 'TEST:SIM:M1.' == 'TEST:SIM:M1'
      E         
      E         - TEST:SIM:M1
      E         + TEST:SIM:M1.
      E         ?            +
      
      tests/test_utils_hastepics.py:66: AssertionError
      

      📌 Teardown phase

      duration:

      0.00019242428243160248
      

      outcome:

      passed
      

    Function: test_disabled_removed_relative_to_upstream

    • Test 237

      📌 Setup phase

      duration:

      0.00015573017299175262
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0012616273015737534
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_hastepics.py
      lineno: 87
      message: AssertionError: _extras is empty; expected at least one entry
      assert 0 > 0
       +  where 0 = len({})
      

      traceback:

      -   path: tests/test_utils_hastepics.py
        lineno: 87
        message: AssertionError
      

      longrepr:

      def test_disabled_removed_relative_to_upstream():
              m = Motor("TEST:SIM:M7")
      
              init_list = tuple(getattr(m, "_init_list", ()))
              extras    = dict(getattr(m, "_extras", {}))
      
              assert len(init_list) > 0, "_init_list is empty; expected at least one field"
      >       assert len(extras) > 0, "_extras is empty; expected at least one entry"
      E       AssertionError: _extras is empty; expected at least one entry
      E       assert 0 > 0
      E        +  where 0 = len({})
      
      tests/test_utils_hastepics.py:87: AssertionError
      

      📌 Teardown phase

      duration:

      0.00015614833682775497
      

      outcome:

      passed
      

    Function: test_motor_val_connect_via_cache

    • Test 239

      📌 Setup phase

      duration:

      0.0001475885510444641
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      2.0013941125944257
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_hastepics.py
      lineno: 145
      message: AssertionError: assert False
       +  where False = wait_for_connection(timeout=2.0)
       +    where wait_for_connection = <PV 'TEST:SIM:M5.VAL': not connected>.wait_for_connection
      

      traceback:

      -   path: tests/test_utils_hastepics.py
        lineno: 145
        message: AssertionError
      

      longrepr:

      def test_motor_val_connect_via_cache():
              motor_prefix = "TEST:SIM:M5"
              pvname = f"{motor_prefix}.VAL"
      
              assert not _in_pv_cache(pvname)
      
              m = Motor(motor_prefix)
      
              assert _in_pv_cache(pvname), f"{pvname} should be cached after Motor()"
      
              pv = _get_cached_pv(pvname)
              assert pv is not None
              assert not pv.connected
      
      >       assert pv.wait_for_connection(timeout=2.0)
      E       AssertionError: assert False
      E        +  where False = wait_for_connection(timeout=2.0)
      E        +    where wait_for_connection = <PV 'TEST:SIM:M5.VAL': not connected>.wait_for_connection
      
      tests/test_utils_hastepics.py:145: AssertionError
      

      📌 Teardown phase

      duration:

      0.00020547863095998764
      

      outcome:

      passed
      

    Function: test_speedup_motor_instantiation

    • Test 241

      📌 Setup phase

      duration:

      0.00016592256724834442
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      6.002398373559117
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/pyepics-3.4.3-py3.9.egg/epics/motor.py
      lineno: 254
      message: epics.motor.MotorException: TEST:SIM:M8 is not an Epics Motor
      

      traceback:

      -   path: tests/test_utils_hastepics.py
        lineno: 174
        message: None
      -   path: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/pyepics-3.4.3-py3.9.egg/epics/motor.py
        lineno: 254
        message: MotorException
      

      longrepr:

      def test_speedup_motor_instantiation():
              """On exige juste pas de grosse régression vs EPICS."""
              t0 = time.perf_counter()
              Motor("TEST:SIM:M6")
              t1 = time.perf_counter()
      
              t2 = time.perf_counter()
      >       epics.Motor("TEST:SIM:M8")
      
      tests/test_utils_hastepics.py:174: 
      _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
      
      self = <epics.Motor: TEST:SIM:M8.: 'None'>, name = 'TEST:SIM:M8', timeout = 3.0
      
          def __init__(self, name=None, timeout=3.0):
              if name is None:
                  raise MotorException("must supply motor name")
      
              if name.endswith('.VAL'):
                  name = name[:-4]
              if name.endswith('.'):
                  name = name[:-1]
      
              self._prefix = name
              device.Device.__init__(self, name, delim='.',
                                     attrs=self._init_list,
                                     timeout=timeout)
               # make sure this is really a motor!
              rectype = self.get('RTYP')
              if rectype != 'motor':
      >           raise MotorException("%s is not an Epics Motor" % name)
      E           epics.motor.MotorException: TEST:SIM:M8 is not an Epics Motor
      
      /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/pyepics-3.4.3-py3.9.egg/epics/motor.py:254: MotorException
      

      📌 Teardown phase

      duration:

      0.0002315109595656395
      

      outcome:

      passed
      

    Function: test_speedup_motor_PV

    • Test 242

      📌 Setup phase

      duration:

      0.00017888937145471573
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0020089754834771156
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_hastepics.py
      lineno: 196
      message: AssertionError: assert False
       +  where False = <PV 'TEST:SIM:M14.VAL': not connected>.connected
      

      traceback:

      -   path: tests/test_utils_hastepics.py
        lineno: 196
        message: AssertionError
      

      longrepr:

      def test_speedup_motor_PV():
              # baseline EPICS
              m_slow = Motor("TEST:SIM:M14")
              t0 = time.perf_counter()
              pv_slow = m_slow.PV("VAL", connect=True)
              t1 = time.perf_counter()
      
              m_fast = Motor("TEST:SIM:M15")
              t2 = time.perf_counter()
              pv_fast = m_fast.PV("VAL", connect=False)
              t3 = time.perf_counter()
      
      >       assert pv_slow.connected
      E       AssertionError: assert False
      E        +  where False = <PV 'TEST:SIM:M14.VAL': not connected>.connected
      
      tests/test_utils_hastepics.py:196: AssertionError
      

      📌 Teardown phase

      duration:

      0.0001608189195394516
      

      outcome:

      passed
      
  • 📄 test_utils_logcfg.py

    Function: test_import_logging_once_per_module

    • Test 258

      📌 Setup phase

      duration:

      0.00013606064021587372
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      1.7058054404333234
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_logcfg.py
      lineno: 78
      message: AssertionError: Expected 1 import log for 'math', found 0
      assert 0 == 1
      

      traceback:

      -   path: tests/test_utils_logcfg.py
        lineno: 78
        message: AssertionError
      

      longrepr:

      def test_import_logging_once_per_module():
              code = textwrap.dedent("""
                  from slic.utils.logcfg import *
                  import math
                  import io
                  import random
              """)
      
              with tempfile.NamedTemporaryFile("w", suffix=".py", delete=False) as tmp:
                  tmp.write(code)
                  tmp_path = tmp.name
      
              env = os.environ.copy()
              root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
              env["PYTHONPATH"] = root_path + os.pathsep + env.get("PYTHONPATH", "")
      
              result = subprocess.run([sys.executable, tmp_path], capture_output=True, text=True, env=env)
              os.remove(tmp_path)
      
              assert result.returncode == 0, f"Script failed:\n{result.stderr}"
      
              stderr = result.stderr
              print(stderr)
              lines = stderr.splitlines()
              for mod in ["math", "io", "random"]:
                  count = sum(1 for line in lines if f"importing: {mod}" in line)
      >           assert count == 1, f"Expected 1 import log for '{mod}', found {count}"
      E           AssertionError: Expected 1 import log for 'math', found 0
      E           assert 0 == 1
      
      tests/test_utils_logcfg.py:78: AssertionError
      

      📌 Teardown phase

      duration:

      0.0003666793927550316
      

      outcome:

      passed
      
  • 📄 test_utils_shortcut.py

    Function: TestShortcutsSingleton

    • Test 466

      📌 Setup phase

      duration:

      0.00027953553944826126
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.000656353309750557
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_shortcut.py
      lineno: 138
      message: assert 3 == 2
       +  where 3 = len({'<lambda>': Shortcut "<lambda>", 'FuncA': Shortcut "FuncA", 'FuncB': Shortcut "FuncB"})
       +    where {'<lambda>': Shortcut "<lambda>", 'FuncA': Shortcut "FuncA", 'FuncB': Shortcut "FuncB"} = _get()
       +      where _get = <lambda>: Shortcut "<lambda>"\nFuncA:    Shortcut "FuncA"\nFuncB:    Shortcut "FuncB"\n._get
      

      traceback:

      -   path: tests/test_utils_shortcut.py
        lineno: 138
        message: AssertionError
      

      longrepr:

      self = <test_utils_shortcut.TestShortcutsSingleton object at 0x7fe1c5aedfa0>
      
          def test_registration(self):
              # Test automatic registration
              @as_shortcut(name="FuncA")
              def func_a():
                  pass
      
              @as_shortcut(name="FuncB")
              def func_b():
                  pass
      
      >       assert len(shortcuts._get()) == 2
      E       assert 3 == 2
      E        +  where 3 = len({'<lambda>': Shortcut "<lambda>", 'FuncA': Shortcut "FuncA", 'FuncB': Shortcut "FuncB"})
      E        +    where {'<lambda>': Shortcut "<lambda>", 'FuncA': Shortcut "FuncA", 'FuncB': Shortcut "FuncB"} = _get()
      E        +      where _get = <lambda>: Shortcut "<lambda>"\nFuncA:    Shortcut "FuncA"\nFuncB:    Shortcut "FuncB"\n._get
      
      tests/test_utils_shortcut.py:138: AssertionError
      

      📌 Teardown phase

      duration:

      0.00019372906535863876
      

      outcome:

      passed
      

    Function: TestFullIntegration

    • Test 471

      📌 Setup phase

      duration:

      0.00026206765323877335
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0005178702995181084
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_shortcut.py
      lineno: 203
      message: assert 5 == 2
       +  where 5 = len({'<lambda>': Shortcut "<lambda>", 'First': Shortcut "First", 'FuncA': Shortcut "FuncA", 'FuncB': Shortcut "FuncB", ...})
       +    where {'<lambda>': Shortcut "<lambda>", 'First': Shortcut "First", 'FuncA': Shortcut "FuncA", 'FuncB': Shortcut "FuncB", ...} = _get()
       +      where _get = <lambda>: Shortcut "<lambda>"\nFirst:    Shortcut "First"\nFuncA:    Shortcut "FuncA"\nFuncB:    Shortcut "FuncB"\nSecond:   Shortcut "Second"\n._get
      

      traceback:

      -   path: tests/test_utils_shortcut.py
        lineno: 203
        message: AssertionError
      

      longrepr:

      self = <test_utils_shortcut.TestFullIntegration object at 0x7fe1c5cbef10>
      
          def test_multiple_shortcuts(self):
              # Test multiple shortcuts coexistence
              @as_shortcut(name="First")
              def first():
                  return 1
      
              @as_shortcut(name="Second")
              def second():
                  return 2
      
              assert shortcuts["First"].func() == 1
              assert shortcuts["Second"].func() == 2
      >       assert len(shortcuts._get()) == 2
      E       assert 5 == 2
      E        +  where 5 = len({'<lambda>': Shortcut "<lambda>", 'First': Shortcut "First", 'FuncA': Shortcut "FuncA", 'FuncB': Shortcut "FuncB", ...})
      E        +    where {'<lambda>': Shortcut "<lambda>", 'First': Shortcut "First", 'FuncA': Shortcut "FuncA", 'FuncB': Shortcut "FuncB", ...} = _get()
      E        +      where _get = <lambda>: Shortcut "<lambda>"\nFirst:    Shortcut "First"\nFuncA:    Shortcut "FuncA"\nFuncB:    Shortcut "FuncB"\nSecond:   Shortcut "Second"\n._get
      
      tests/test_utils_shortcut.py:203: AssertionError
      

      📌 Teardown phase

      duration:

      0.00027131568640470505
      

      outcome:

      passed
      
  • 📄 test_utils_tqdm_mod.py

    Function: test_float_alignment_in_bar

    • Test 485

      📌 Setup phase

      duration:

      0.00012619514018297195
      

      outcome:

      passed
      

      📌 Call phase

      duration:

      0.0014732033014297485
      

      outcome:

      failed
      

      crash:

      path: /workspace/tligui_y/slic/tests/test_utils_tqdm_mod.py
      lineno: 130
      message: assert 3 == 1
       +  where 3 = len({50, 64, 65})
       +    where {50, 64, 65} = set([50, 64, 64, 65, 65])
      

      traceback:

      -   path: tests/test_utils_tqdm_mod.py
        lineno: 130
        message: AssertionError
      

      longrepr:

      def test_float_alignment_in_bar():
              # Capture the tqdm output into a string buffer
              f = io.StringIO()
              with redirect_stdout(f):
                  bar = tqdm_mod(total=100.12, desc="AlignBar", file=f, miniters=1, mininterval=0)
                  bar.set(1.3333)
                  bar.set(12.5)
                  bar.set(99.89)
                  bar.set(100.12)
                  bar.close()
      
              # Extract lines containing the label
              lines = extract_lines(f.getvalue(), "AlignBar")
      
              # Expected formatted values using format_sizeof
              expected_values = [
                  "1.3/100.1",
                  "12.5/100.1",
                  "99.9/100.1",
                  "100.1/100.1",
              ]
      
              # Extract the actual padded float/total strings from the full lines
              values = []
              for line in lines:
                  match = re.search(r"(\d{1,3}\.\d)/100\.1", line)
                  if match:
                      values.append(match.group(0))
      
              # Ensure raw 100.12 never appears : format_sizeof must have truncated it
              assert all("100.12" not in line for line in lines), "Unrounded value '100.12' found in output!"
      
              # Check all expected values appear rounded as expected by format_sizeof
              for expected in expected_values:
                  assert expected in values, f"Missing expected value: {expected}"
      
              # Check that all values are visually aligned, output with same length, to ensure that format_sizeof add the good number avec spaces
              print("\n")
              bar_segments = []
              for line in lines:
                  match = re.search(r".*?\]", line)
                  if match:
                      bar_segments.append(match.group(0))
                      print(match.group(0))
      
              lengths = [len(seg) for seg in bar_segments]
      >       assert len(set(lengths)) == 1
      E       assert 3 == 1
      E        +  where 3 = len({50, 64, 65})
      E        +    where {50, 64, 65} = set([50, 64, 64, 65, 65])
      
      tests/test_utils_tqdm_mod.py:130: AssertionError
      

      📌 Teardown phase

      duration:

      0.00016200728714466095
      

      outcome:

      passed
      

📚 Collected files

(1 tests)
    • Outcome: passed
    • result:
    -   nodeid: .
      type: Dir
    
ci-reports (13 tests)
  • ci-reports
    • Outcome: passed
    • result:
    -   nodeid: ci-reports/allure
      type: Dir
    -   nodeid: ci-reports/junit
      type: Dir
    -   nodeid: ci-reports/markdown
      type: Dir
    
    • ci-reports/allure
      • Outcome: passed
      • result:
      -   nodeid: ci-reports/allure/data
        type: Dir
      -   nodeid: ci-reports/allure/export
        type: Dir
      -   nodeid: ci-reports/allure/history
        type: Dir
      -   nodeid: ci-reports/allure/plugin
        type: Dir
      -   nodeid: ci-reports/allure/widgets
        type: Dir
      
    • ci-reports/allure/data
      • Outcome: passed
      • result:
      -   nodeid: ci-reports/allure/data/test-cases
        type: Dir
      
    • ci-reports/allure/data/test-cases
      • Outcome: passed
      • result:
      []
      
    • ci-reports/allure/export
      • Outcome: passed
      • result:
      []
      
    • ci-reports/allure/history
      • Outcome: passed
      • result:
      []
      
    • ci-reports/allure/plugin
      • Outcome: passed
      • result:
      -   nodeid: ci-reports/allure/plugin/behaviors
        type: Dir
      -   nodeid: ci-reports/allure/plugin/packages
        type: Dir
      -   nodeid: ci-reports/allure/plugin/screen-diff
        type: Dir
      
    • ci-reports/allure/plugin/behaviors
      • Outcome: passed
      • result:
      []
      
    • ci-reports/allure/plugin/packages
      • Outcome: passed
      • result:
      []
      
    • ci-reports/allure/plugin/screen-diff
      • Outcome: passed
      • result:
      []
      
    • ci-reports/allure/widgets
      • Outcome: passed
      • result:
      []
      
    • ci-reports/junit
      • Outcome: passed
      • result:
      []
      
    • ci-reports/markdown
      • Outcome: passed
      • result:
      []
      
markdown (1 tests)
  • markdown
    • Outcome: passed
    • result:
    []
    
morbidissimo (6 tests)
  • morbidissimo
    • Outcome: passed
    • result:
    -   nodeid: morbidissimo/morbidissimo
      type: Package
    
    • morbidissimo/morbidissimo
      • Outcome: passed
      • result:
      -   nodeid: morbidissimo/morbidissimo/modman
        type: Package
      -   nodeid: morbidissimo/morbidissimo/morioc
        type: Package
      
    • morbidissimo/morbidissimo/modman
      • Outcome: passed
      • result:
      -   nodeid: morbidissimo/morbidissimo/modman/scripts
        type: Dir
      
    • morbidissimo/morbidissimo/modman/scripts
      • Outcome: passed
      • result:
      []
      
    • morbidissimo/morbidissimo/morioc
      • Outcome: passed
      • result:
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py
        type: Module
      
    • morbidissimo/morbidissimo/morioc/test_infer_type.py
      • Outcome: passed
      • result:
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_type_str
        type: Function
        lineno: 14
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_type_float
        type: Function
        lineno: 17
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_type_int
        type: Function
        lineno: 20
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_value_str
        type: Function
        lineno: 24
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_value_long_str
        type: Function
        lineno: 27
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_value_float
        type: Function
        lineno: 32
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_value_int
        type: Function
        lineno: 35
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_empty_value_str
        type: Function
        lineno: 39
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_empty_value_float
        type: Function
        lineno: 42
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_empty_value_int
        type: Function
        lineno: 45
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_pstrue_str
        type: Function
        lineno: 49
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_pstrue_float
        type: Function
        lineno: 52
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_pstrue_int
        type: Function
        lineno: 55
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_psfalse_str
        type: Function
        lineno: 59
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_psfalse_float
        type: Function
        lineno: 62
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_psfalse_int
        type: Function
        lineno: 65
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_None
        type: Function
        lineno: 69
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_True
        type: Function
        lineno: 72
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_False
        type: Function
        lineno: 75
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_nan
        type: Function
        lineno: 78
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_np_nan
        type: Function
        lineno: 81
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_np1D_int
        type: Function
        lineno: 85
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_np2D_int
        type: Function
        lineno: 91
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_np1D_float
        type: Function
        lineno: 99
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_np2D_float
        type: Function
        lineno: 105
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_np1D_bool
        type: Function
        lineno: 114
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_np1D_object
        type: Function
        lineno: 119
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_np_scalar_int
        type: Function
        lineno: 126
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_np_scalar_float
        type: Function
        lineno: 131
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_np_scalar_bool
        type: Function
        lineno: 136
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_list
        type: Function
        lineno: 145
      -   nodeid: morbidissimo/morbidissimo/morioc/test_infer_type.py::test_it_tuple
        type: Function
        lineno: 150
      
outputs (1 tests)
  • outputs
    • Outcome: passed
    • result:
    []
    
slic (30 tests)
  • slic
    • Outcome: passed
    • result:
    -   nodeid: slic/core
      type: Package
    -   nodeid: slic/devices
      type: Package
    -   nodeid: slic/gui
      type: Package
    -   nodeid: slic/utils
      type: Package
    
    • slic/core
      • Outcome: passed
      • result:
      -   nodeid: slic/core/acquisition
        type: Package
      -   nodeid: slic/core/adjustable
        type: Package
      -   nodeid: slic/core/condition
        type: Package
      -   nodeid: slic/core/device
        type: Package
      -   nodeid: slic/core/scanner
        type: Package
      -   nodeid: slic/core/sensor
        type: Package
      -   nodeid: slic/core/task
        type: Package
      
    • slic/core/acquisition
      • Outcome: passed
      • result:
      -   nodeid: slic/core/acquisition/broker
        type: Package
      
    • slic/core/acquisition/broker
      • Outcome: passed
      • result:
      []
      
    • slic/core/adjustable
      • Outcome: passed
      • result:
      []
      
    • slic/core/condition
      • Outcome: passed
      • result:
      []
      
    • slic/core/device
      • Outcome: passed
      • result:
      []
      
    • slic/core/scanner
      • Outcome: passed
      • result:
      []
      
    • slic/core/sensor
      • Outcome: passed
      • result:
      []
      
    • slic/core/task
      • Outcome: passed
      • result:
      []
      
    • slic/devices
      • Outcome: passed
      • result:
      -   nodeid: slic/devices/cameras
        type: Package
      -   nodeid: slic/devices/endstations
        type: Package
      -   nodeid: slic/devices/general
        type: Package
      -   nodeid: slic/devices/loptics
        type: Package
      -   nodeid: slic/devices/timing
        type: Package
      -   nodeid: slic/devices/xdiagnostics
        type: Package
      -   nodeid: slic/devices/xoptics
        type: Package
      
    • slic/devices/cameras
      • Outcome: passed
      • result:
      []
      
    • slic/devices/endstations
      • Outcome: passed
      • result:
      []
      
    • slic/devices/general
      • Outcome: passed
      • result:
      -   nodeid: slic/devices/general/detectors
        type: Package
      -   nodeid: slic/devices/general/unused
        type: Dir
      
    • slic/devices/general/detectors
      • Outcome: passed
      • result:
      []
      
    • slic/devices/general/unused
      • Outcome: passed
      • result:
      []
      
    • slic/devices/loptics
      • Outcome: passed
      • result:
      []
      
    • slic/devices/timing
      • Outcome: passed
      • result:
      -   nodeid: slic/devices/timing/events
        type: Package
      
    • slic/devices/timing/events
      • Outcome: passed
      • result:
      []
      
    • slic/devices/xdiagnostics
      • Outcome: passed
      • result:
      []
      
    • slic/devices/xoptics
      • Outcome: passed
      • result:
      -   nodeid: slic/devices/xoptics/slits
        type: Package
      -   nodeid: slic/devices/xoptics/unused
        type: Dir
      
    • slic/devices/xoptics/slits
      • Outcome: passed
      • result:
      []
      
    • slic/devices/xoptics/unused
      • Outcome: passed
      • result:
      []
      
    • slic/gui
      • Outcome: passed
      • result:
      -   nodeid: slic/gui/daqpanels
        type: Package
      -   nodeid: slic/gui/widgets
        type: Package
      
    • slic/gui/daqpanels
      • Outcome: passed
      • result:
      []
      
    • slic/gui/widgets
      • Outcome: passed
      • result:
      []
      
    • slic/utils
      • Outcome: passed
      • result:
      -   nodeid: slic/utils/ioc
        type: Package
      -   nodeid: slic/utils/unused
        type: Dir
      
    • slic/utils/ioc
      • Outcome: passed
      • result:
      []
      
    • slic/utils/unused
      • Outcome: passed
      • result:
      -   nodeid: slic/utils/unused/xsim
        type: Package
      
    • slic/utils/unused/xsim
      • Outcome: passed
      • result:
      []
      
temp-ci (1 tests)
  • temp-ci
    • Outcome: passed
    • result:
    []
    
test-ci (1 tests)
  • test-ci
    • Outcome: passed
    • result:
    []
    
tests (54 tests)
  • tests
    • Outcome: passed
    • result:
    -   nodeid: tests/test_utils_argfwd.py
      type: Module
    -   nodeid: tests/test_utils_ask_yes_no.py
      type: Module
    -   nodeid: tests/test_utils_channels.py
      type: Module
    -   nodeid: tests/test_utils_config.py
      type: Module
    -   nodeid: tests/test_utils_cpint.py
      type: Module
    -   nodeid: tests/test_utils_dbusnotify.py
      type: Module
    -   nodeid: tests/test_utils_debug.py
      type: Module
    -   nodeid: tests/test_utils_dictext.py
      type: Module
    -   nodeid: tests/test_utils_dotdir.py
      type: Module
    -   nodeid: tests/test_utils_duo.py
      type: Module
    -   nodeid: tests/test_utils_elog.py
      type: Module
    -   nodeid: tests/test_utils_eval.py
      type: Module
    -   nodeid: tests/test_utils_exceptions.py
      type: Module
    -   nodeid: tests/test_utils_get_adj.py
      type: Module
    -   nodeid: tests/test_utils_hastepics.py
      type: Module
    -   nodeid: tests/test_utils_ipy.py
      type: Module
    -   nodeid: tests/test_utils_jsonext.py
      type: Module
    -   nodeid: tests/test_utils_lazypv.py
      type: Module
    -   nodeid: tests/test_utils_logcfg.py
      type: Module
    -   nodeid: tests/test_utils_logign.py
      type: Module
    -   nodeid: tests/test_utils_marker.py
      type: Module
    -   nodeid: tests/test_utils_metaclasses.py
      type: Module
    -   nodeid: tests/test_utils_namespace.py
      type: Module
    -   nodeid: tests/test_utils_npy.py
      type: Module
    -   nodeid: tests/test_utils_opmsg.py
      type: Module
    -   nodeid: tests/test_utils_path.py
      type: Module
    -   nodeid: tests/test_utils_picklio.py
      type: Module
    -   nodeid: tests/test_utils_printing.py
      type: Module
    -   nodeid: tests/test_utils_pv.py
      type: Module
    -   nodeid: tests/test_utils_pvpreload.py
      type: Module
    -   nodeid: tests/test_utils_pyepics.py
      type: Module
    -   nodeid: tests/test_utils_rangebar.py
      type: Module
    -   nodeid: tests/test_utils_readable.py
      type: Module
    -   nodeid: tests/test_utils_registry.py
      type: Module
    -   nodeid: tests/test_utils_reprate.py
      type: Module
    -   nodeid: tests/test_utils_richcfg.py
      type: Module
    -   nodeid: tests/test_utils_run_later.py
      type: Module
    -   nodeid: tests/test_utils_sendmail.py
      type: Module
    -   nodeid: tests/test_utils_sendsms.py
      type: Module
    -   nodeid: tests/test_utils_shortcut.py
      type: Module
    -   nodeid: tests/test_utils_snapshot.py
      type: Module
    -   nodeid: tests/test_utils_termtitle.py
      type: Module
    -   nodeid: tests/test_utils_tqdm_mod.py
      type: Module
    -   nodeid: tests/test_utils_trinary.py
      type: Module
    -   nodeid: tests/test_utils_typecast.py
      type: Module
    -   nodeid: tests/test_utils_utils.py
      type: Module
    -   nodeid: tests/test_utils_xrange.py
      type: Module
    
    • tests/test_utils_argfwd.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_argfwd.py::test_split_at[lst0-2-expected0]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_argfwd.py::test_split_at[lst1-1-expected1]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_argfwd.py::test_split_at[lst2-0-expected2]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_argfwd.py::test_merge_lists_unique[a0-b0-expected0]
        type: Function
        lineno: 17
      -   nodeid: tests/test_utils_argfwd.py::test_merge_lists_unique[a1-b1-expected1]
        type: Function
        lineno: 17
      -   nodeid: tests/test_utils_argfwd.py::test_merge_lists_unique[a2-b2-expected2]
        type: Function
        lineno: 17
      -   nodeid: tests/test_utils_argfwd.py::test_merge_dicts_unique[a0-b0-expected0]
        type: Function
        lineno: 26
      -   nodeid: tests/test_utils_argfwd.py::test_merge_dicts_unique[a1-b1-expected1]
        type: Function
        lineno: 26
      -   nodeid: tests/test_utils_argfwd.py::test_merge_dicts_unique[a2-b2-expected2]
        type: Function
        lineno: 26
      -   nodeid: tests/test_utils_argfwd.py::test_make_params_pos_basic[pos0-expected_names0]
        type: Function
        lineno: 35
      -   nodeid: tests/test_utils_argfwd.py::test_make_params_pos_basic[pos1-expected_names1]
        type: Function
        lineno: 35
      -   nodeid: tests/test_utils_argfwd.py::test_make_params_pos_basic[pos2-expected_names2]
        type: Function
        lineno: 35
      -   nodeid: tests/test_utils_argfwd.py::test_make_params_kw_basic[kw0-expected_keys0-expected_defaults0]
        type: Function
        lineno: 48
      -   nodeid: tests/test_utils_argfwd.py::test_make_params_kw_basic[kw1-expected_keys1-expected_defaults1]
        type: Function
        lineno: 48
      -   nodeid: tests/test_utils_argfwd.py::test_make_params_kw_basic[kw2-expected_keys2-expected_defaults2]
        type: Function
        lineno: 48
      -   nodeid: tests/test_utils_argfwd.py::test_make_signature_parametrized[pos0-kw0-(x, y, z=3)]
        type: Function
        lineno: 60
      -   nodeid: tests/test_utils_argfwd.py::test_make_signature_parametrized[pos1-kw1-(a, b=1, c=2)]
        type: Function
        lineno: 60
      -   nodeid: tests/test_utils_argfwd.py::test_make_signature_parametrized[pos2-kw2-(flag=False)]
        type: Function
        lineno: 60
      -   nodeid: tests/test_utils_argfwd.py::test_get_args_parametrized[<lambda>-expected_pos0-expected_kw0]
        type: Function
        lineno: 71
      -   nodeid: tests/test_utils_argfwd.py::test_get_args_parametrized[<lambda>-expected_pos1-expected_kw1]
        type: Function
        lineno: 71
      -   nodeid: tests/test_utils_argfwd.py::test_get_args_parametrized[<lambda>-expected_pos2-expected_kw2]
        type: Function
        lineno: 71
      -   nodeid: tests/test_utils_argfwd.py::test_signature_visible[wrap_all-(a, b, d=30, c=10)]
        type: Function
        lineno: 104
      -   nodeid: tests/test_utils_argfwd.py::test_signature_visible[wrap_skip-(a, b, c=10, d=20)]
        type: Function
        lineno: 104
      -   nodeid: tests/test_utils_argfwd.py::test_signature_visible[wrap_ignore_all-(x, y, c=10, d=20)]
        type: Function
        lineno: 104
      -   nodeid: tests/test_utils_argfwd.py::test_wrapper_behavior[wrap_all-args0-kwargs0-36]
        type: Function
        lineno: 112
      -   nodeid: tests/test_utils_argfwd.py::test_wrapper_behavior[wrap_all-args1-kwargs1-11]
        type: Function
        lineno: 112
      -   nodeid: tests/test_utils_argfwd.py::test_wrapper_behavior[wrap_skip-args2-kwargs2-10]
        type: Function
        lineno: 112
      -   nodeid: tests/test_utils_argfwd.py::test_wrapper_behavior[wrap_ignore_all-args3-kwargs3-10]
        type: Function
        lineno: 112
      
    • tests/test_utils_ask_yes_no.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no[None-y-True-Question? [y/n] ]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no[None-yes-True-Question? [y/n] ]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no[None-n-False-Question? [y/n] ]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no[None-no-False-Question? [y/n] ]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no[None-user_input4-True-Question? [y/n] ]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no[None-user_input5-False-Question? [y/n] ]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no[None-user_input6-True-Question? [y/n] ]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no[y-y-True-Question? [Y/n] ]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no[y-n-False-Question? [Y/n] ]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no[y--True-Question? [Y/n] ]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no[n-y-True-Question? [y/N] ]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no[n-n-False-Question? [y/N] ]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no[n--False-Question? [y/N] ]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_c[None-KeyboardInterrupt-False-n]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_c[None-KeyboardInterrupt-True-y]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_c[y-KeyboardInterrupt-False-n]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_c[y-KeyboardInterrupt-True-y]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_c[n-KeyboardInterrupt-False-n]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_c[None-user_input5-False-n]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_c[None-user_input6-True-y]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_c[None-user_input7-False-None]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_c[n-user_input8-False-None]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_c[n-user_input9-False-Invalid]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_d[None-EOFError-False-n]
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_d[None-EOFError-True-y]
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_d[y-EOFError-True-y]
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_d[n-EOFError-True-y]
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_d[n-EOFError-False-n]
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_d[None-user_input5-True-y]
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_d[None-user_input6-False-n]
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_d[y-EOFError-True-None]
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_d[n-EOFError-False-None]
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_d[None-user_input9-True-None]
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_d[n-user_input10-False-None]
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_d[None-user_input11-True-None]
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_d[None-user_input12-False-n]
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_ctrl_d[None-user_input13-True-y]
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_mixed_sequences[None-invalid-None-user_input0-False]
        type: Function
        lineno: 117
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_mixed_sequences[None-None-notananswer-user_input1-True]
        type: Function
        lineno: 117
      -   nodeid: tests/test_utils_ask_yes_no.py::test_ask_yes_no_mixed_sequences[None-n-nop-user_input2-False]
        type: Function
        lineno: 117
      
    • tests/test_utils_channels.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_channels.py::test_load_channels_and_channels_class_with_professional_names
        type: Function
        lineno: 42
      
    • tests/test_utils_config.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_config.py::test_config_with_nested_and_list_data
        type: Function
        lineno: 15
      -   nodeid: tests/test_utils_config.py::test_config_with_strange_and_edge_keys
        type: Function
        lineno: 73
      
    • tests/test_utils_cpint.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_cpint.py::test_load_color_variants_all_keys_and_types[red]
        type: Function
        lineno: 9
      -   nodeid: tests/test_utils_cpint.py::test_load_color_variants_all_keys_and_types[blue]
        type: Function
        lineno: 9
      -   nodeid: tests/test_utils_cpint.py::test_load_color_variants_all_keys_and_types[yellow]
        type: Function
        lineno: 9
      -   nodeid: tests/test_utils_cpint.py::test_load_color_variants_all_keys_and_types[green]
        type: Function
        lineno: 9
      -   nodeid: tests/test_utils_cpint.py::test_load_color_variants_all_keys_and_types[cyan]
        type: Function
        lineno: 9
      -   nodeid: tests/test_utils_cpint.py::test_load_color_variants_all_keys_and_types[magenta]
        type: Function
        lineno: 9
      -   nodeid: tests/test_utils_cpint.py::test_load_color_variants_all_keys_and_types[white]
        type: Function
        lineno: 9
      -   nodeid: tests/test_utils_cpint.py::test_load_color_variants_all_keys_and_types[black]
        type: Function
        lineno: 9
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects0-color_spec0- | -['Fancy', 'list'] | {'a': 7} | None-None]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects1-color_spec1- - -{'k': [1, 2]} - 99 - ['X', ['Y']]-None]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects2-color_spec2- / -[] / {} / End-None]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects3-color_spec3-;-['', [3, 4]];done;0-None]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects4-color_spec4-::-['alpha', None]::['beta', {}]::stop-None]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects5-color_spec5- ... -['deep', ['deeper', ['deepest']]] ... X-None]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects6-color_spec6- // -{'dict': {'nested': [4, 5]}} // [True, False] // 6.28-None]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects7-color_spec7-==-['A', ['B']]==string==C-None]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects8-color_spec8- ++ -['Test', None, []] ++ {'v': 0}-None]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects9-None-;-['no', 'color'];plain-None]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects10-None- | -['simple'] |  | 12-None]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects11-None- : -[['very', 'deep']] : {'ok': True}-None]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects12-color_spec12-|-['fail', 'color']|123-ValueError]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects13-color_spec13- * -['error'] * {}-ValueError]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects14-color_spec14-//-['nope']//['bad']-ValueError]
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_cpint.py::test_cprint_all_cases_fancy[objects15-color_spec15----wrong--base-ValueError]
        type: Function
        lineno: 24
      
    • tests/test_utils_dbusnotify.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_dbusnotify.py::DBusTestCase
        type: UnitTestCase
      -   nodeid: tests/test_utils_dbusnotify.py::test_notify_create
        type: Function
        lineno: 26
      -   nodeid: tests/test_utils_dbusnotify.py::test_notify_update
        type: Function
        lineno: 37
      -   nodeid: tests/test_utils_dbusnotify.py::test_get_server_info
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_dbusnotify.py::test_get_capabilities
        type: Function
        lineno: 57
      -   nodeid: tests/test_utils_dbusnotify.py::test_notify_and_close
        type: Function
        lineno: 72
      -   nodeid: tests/test_utils_dbusnotify.py::test_notify_invalid_value
        type: Function
        lineno: 82
      -   nodeid: tests/test_utils_dbusnotify.py::test_convert_dbus_strings
        type: Function
        lineno: 88
      
    • tests/test_utils_dbusnotify.py::DBusTestCase
      • Outcome: passed
      • result:
      []
      
    • tests/test_utils_debug.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_debug.py::test_traceable[A-entry0-creating: A(10, 20)]
        type: Function
        lineno: 21
      -   nodeid: tests/test_utils_debug.py::test_traceable[A-entry1-creating: A(10, 20, e=100)]
        type: Function
        lineno: 21
      -   nodeid: tests/test_utils_debug.py::test_traceable[A-entry2-creating: A('foo', [1, 2, 3], flag=True, data={'x': 9})]
        type: Function
        lineno: 21
      -   nodeid: tests/test_utils_debug.py::test_traceable[A-entry3-creating: A(CustomObj(big), [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], name='test', meta='yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy...)]
        type: Function
        lineno: 21
      -   nodeid: tests/test_utils_debug.py::test_traceable[A-entry4-creating: A('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA..., [0, 0, 0, 0, 0])]
        type: Function
        lineno: 21
      -   nodeid: tests/test_utils_debug.py::test_short_repr[abc-10-'abc']
        type: Function
        lineno: 52
      -   nodeid: tests/test_utils_debug.py::test_short_repr[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-10-'aaaaaaaaaa...]
        type: Function
        lineno: 52
      -   nodeid: tests/test_utils_debug.py::test_short_repr[12345-10-12345]
        type: Function
        lineno: 52
      -   nodeid: tests/test_utils_debug.py::test_short_repr[value3-15-[0, 0, 0, 0, 0,...]
        type: Function
        lineno: 52
      -   nodeid: tests/test_utils_debug.py::test_short_repr[None-10-None]
        type: Function
        lineno: 52
      -   nodeid: tests/test_utils_debug.py::test_short_repr[value5-20-Obj(xxxxxxxxxxxxxxxxx...]
        type: Function
        lineno: 52
      
    • tests/test_utils_dictext.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_dictext.py::test_attrdict_getattr[data0-x-1]
        type: Function
        lineno: 12
      -   nodeid: tests/test_utils_dictext.py::test_attrdict_getattr[data1-world-ok]
        type: Function
        lineno: 12
      -   nodeid: tests/test_utils_dictext.py::test_attrdict_getattr[data2-outer-expected2]
        type: Function
        lineno: 12
      -   nodeid: tests/test_utils_dictext.py::test_attrdict_setattr[initial0-nouveau-123]
        type: Function
        lineno: 26
      -   nodeid: tests/test_utils_dictext.py::test_attrdict_setattr[initial1-b-valeur]
        type: Function
        lineno: 26
      -   nodeid: tests/test_utils_dictext.py::test_attrdict_delattr[initial0-a-expected_keys0]
        type: Function
        lineno: 40
      -   nodeid: tests/test_utils_dictext.py::test_attrdict_delattr[initial1-k-expected_keys1]
        type: Function
        lineno: 40
      -   nodeid: tests/test_utils_dictext.py::test_attrdict_dir[data0-expected_keys0]
        type: Function
        lineno: 55
      -   nodeid: tests/test_utils_dictext.py::test_attrdict_dir[data1-expected_keys1]
        type: Function
        lineno: 55
      -   nodeid: tests/test_utils_dictext.py::test_attrdict_getattr_and_missing[data0-x-1-None]
        type: Function
        lineno: 69
      -   nodeid: tests/test_utils_dictext.py::test_attrdict_getattr_and_missing[data1-missing-None-'MyDict' object has no attribute 'missing']
        type: Function
        lineno: 69
      -   nodeid: tests/test_utils_dictext.py::test_dictupdatemixin_init_and_update[init_kwargs0-None-kwargs0-expected0]
        type: Function
        lineno: 90
      -   nodeid: tests/test_utils_dictext.py::test_dictupdatemixin_init_and_update[init_kwargs1-other1-kwargs1-expected1]
        type: Function
        lineno: 90
      -   nodeid: tests/test_utils_dictext.py::test_dictupdatemixin_init_and_update[init_kwargs2-other2-kwargs2-expected2]
        type: Function
        lineno: 90
      -   nodeid: tests/test_utils_dictext.py::test_dictupdatemixin_init_and_update[init_kwargs3-None-kwargs3-expected3]
        type: Function
        lineno: 90
      -   nodeid: tests/test_utils_dictext.py::test_dictupdatemixin_init_and_update[init_kwargs4-other4-kwargs4-expected4]
        type: Function
        lineno: 90
      -   nodeid: tests/test_utils_dictext.py::test_dictupdatemixin_init_and_update[init_kwargs5-other5-kwargs5-expected5]
        type: Function
        lineno: 90
      
    • tests/test_utils_dotdir.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_dotdir.py::test_dotdir_creation_and_base_exists
        type: Function
        lineno: 14
      -   nodeid: tests/test_utils_dotdir.py::test_dotdir_repr_returns_path_str
        type: Function
        lineno: 28
      -   nodeid: tests/test_utils_dotdir.py::test_dotdir_call
        type: Function
        lineno: 35
      
    • tests/test_utils_duo.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_duo.py::TestPickledDictReal
        type: Class
      -   nodeid: tests/test_utils_duo.py::TestSecrets
        type: Class
      -   nodeid: tests/test_utils_duo.py::test_get_pgroup_raises_if_no_key
        type: Function
        lineno: 142
      -   nodeid: tests/test_utils_duo.py::test_get_pgroup_info_with_props_same_name_and_pi
        type: Function
        lineno: 148
      -   nodeid: tests/test_utils_duo.py::test_get_pgroup_info_with_props_different_pi
        type: Function
        lineno: 175
      -   nodeid: tests/test_utils_duo.py::test_get_pgroup_info_without_props_with_owner
        type: Function
        lineno: 202
      -   nodeid: tests/test_utils_duo.py::test_get_pgroup_info_without_props_no_owner
        type: Function
        lineno: 222
      -   nodeid: tests/test_utils_duo.py::test_get_pgroup_info_mock
        type: Function
        lineno: 240
      
    • tests/test_utils_duo.py::TestPickledDictReal
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_duo.py::TestPickledDictReal::test_set_get
        type: Function
        lineno: 15
      -   nodeid: tests/test_utils_duo.py::TestPickledDictReal::test_load
        type: Function
        lineno: 49
      
    • tests/test_utils_duo.py::TestSecrets
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_duo.py::TestSecrets::test_secret_workflow
        type: Function
        lineno: 93
      -   nodeid: tests/test_utils_duo.py::TestSecrets::test_multiple_secrets
        type: Function
        lineno: 110
      -   nodeid: tests/test_utils_duo.py::TestSecrets::test_keyboard_interrupt
        type: Function
        lineno: 122
      
    • tests/test_utils_elog.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_elog.py::test_get_default_elog_instance_with_direct_password_and_real_check
        type: Function
        lineno: 12
      -   nodeid: tests/test_utils_elog.py::test_get_default_elog_instance_with_wrong_password_and_real_check
        type: Function
        lineno: 31
      -   nodeid: tests/test_utils_elog.py::test_get_default_elog_instance_asks_password_and_opens
        type: Function
        lineno: 42
      -   nodeid: tests/test_utils_elog.py::test_get_default_elog_with_path_home
        type: Function
        lineno: 69
      -   nodeid: tests/test_utils_elog.py::test_screenshot
        type: Function
        lineno: 103
      
    • tests/test_utils_eval.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[1 + 2-3]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[4 - 2-2]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[3 * 5-15]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[10 / 2-5.0]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[10 % 3-1]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[-5--5]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[+7-7]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[1 + 2 * 3-7]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[(1 + 2) * 3-9]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[-(-3)-3]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[-2 + 4 * 2-6]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[(4 + 5) * (6 - 1)-45]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[(((3)))-3]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[-(-(-2))--2]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[3 + +4-7]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[3 + -4--1]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[True + 1-2]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid['string'-string]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid[1e1000 * 1e1000-inf]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_valid['a' + 'b'-ab]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_raises_with_message[2 ** 3-Unsupported BinOp Pow]
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_raises_with_message[3 << 1-Unsupported BinOp LShift]
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_raises_with_message[1 < 2-Unsupported node type Compare]
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_raises_with_message[abs(3)-Unsupported node type Call]
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_raises_with_message[a + 2-Unsupported node type Name]
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_raises_with_message[string-Unsupported node type Name]
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_raises_with_message[[1, 2] + [3]-Unsupported node type List]
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_raises_with_message[{1: 2}-Unsupported node type Dict]
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_runtime_errors[1 / 0-ZeroDivisionError]
        type: Function
        lineno: 52
      -   nodeid: tests/test_utils_eval.py::test_arithmetic_eval_runtime_errors[10 % 0-ZeroDivisionError]
        type: Function
        lineno: 52
      -   nodeid: tests/test_utils_eval.py::test_forgiving_eval[1 + 2-3]
        type: Function
        lineno: 61
      -   nodeid: tests/test_utils_eval.py::test_forgiving_eval[bad + 2-bad + 2]
        type: Function
        lineno: 61
      -   nodeid: tests/test_utils_eval.py::test_forgiving_eval[1 / 0-1 / 0]
        type: Function
        lineno: 61
      -   nodeid: tests/test_utils_eval.py::test_forgiving_eval[2 ** 10-2 ** 10]
        type: Function
        lineno: 61
      -   nodeid: tests/test_utils_eval.py::test_defaulting_eval[3 * 4-0-12]
        type: Function
        lineno: 71
      -   nodeid: tests/test_utils_eval.py::test_defaulting_eval[invalid + 1-99-99]
        type: Function
        lineno: 71
      -   nodeid: tests/test_utils_eval.py::test_defaulting_eval[1 / 0--1--1]
        type: Function
        lineno: 71
      -   nodeid: tests/test_utils_eval.py::test_defaulting_eval[2 ** 10-42-42]
        type: Function
        lineno: 71
      
    • tests/test_utils_exceptions.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_exceptions.py::test_chained_exception_various[cause_key_error-High-level task failed\ncaused by KeyError: 'missing']
        type: Function
        lineno: 28
      -   nodeid: tests/test_utils_exceptions.py::test_chained_exception_various[cause_index_error-High-level task failed\ncaused by IndexError: list index out of range]
        type: Function
        lineno: 28
      -   nodeid: tests/test_utils_exceptions.py::test_chained_exception_various[cause_zero_division-High-level task failed\ncaused by ZeroDivisionError: division by zero]
        type: Function
        lineno: 28
      -   nodeid: tests/test_utils_exceptions.py::test_chained_exception_various[cause_value_error-High-level task failed\ncaused by ValueError: invalid literal for int() with base 10: 'not_a_number']
        type: Function
        lineno: 28
      -   nodeid: tests/test_utils_exceptions.py::test_chained_exception_various[cause_type_error-High-level task failed\ncaused by TypeError: can only concatenate str (not "int") to str]
        type: Function
        lineno: 28
      -   nodeid: tests/test_utils_exceptions.py::test_printed_exception[cause_key_error-KeyError: 'missing']
        type: Function
        lineno: 60
      -   nodeid: tests/test_utils_exceptions.py::test_printed_exception[cause_index_error-IndexError: list index out of range]
        type: Function
        lineno: 60
      -   nodeid: tests/test_utils_exceptions.py::test_printed_exception[cause_zero_division-ZeroDivisionError: division by zero]
        type: Function
        lineno: 60
      -   nodeid: tests/test_utils_exceptions.py::test_printed_exception[cause_value_error-ValueError: invalid literal for int() with base 10: 'not_a_number']
        type: Function
        lineno: 60
      -   nodeid: tests/test_utils_exceptions.py::test_printed_exception[cause_type_error-TypeError: can only concatenate str (not "int") to str]
        type: Function
        lineno: 60
      
    • tests/test_utils_get_adj.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_get_adj.py::test_get_adj_success
        type: Function
        lineno: 23
      -   nodeid: tests/test_utils_get_adj.py::test_get_adj_not_found
        type: Function
        lineno: 27
      -   nodeid: tests/test_utils_get_adj.py::test_ensure_adjs_mixed
        type: Function
        lineno: 31
      -   nodeid: tests/test_utils_get_adj.py::test_get_adjs_filter
        type: Function
        lineno: 37
      
    • tests/test_utils_hastepics.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_hastepics.py::test_get_pv_connect_false_and_true
        type: Function
        lineno: 29
      -   nodeid: tests/test_utils_hastepics.py::test_motor_init_strips_suffixes
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_hastepics.py::test_motor_invalid_name_raises
        type: Function
        lineno: 74
      -   nodeid: tests/test_utils_hastepics.py::test_disabled_removed_relative_to_upstream
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_hastepics.py::test_motor_init_list_and_extras_build_handles_eagerly
        type: Function
        lineno: 100
      -   nodeid: tests/test_utils_hastepics.py::test_motor_val_connect_via_cache
        type: Function
        lineno: 130
      -   nodeid: tests/test_utils_hastepics.py::test_speedup_get_pv
        type: Function
        lineno: 149
      -   nodeid: tests/test_utils_hastepics.py::test_speedup_motor_instantiation
        type: Function
        lineno: 166
      -   nodeid: tests/test_utils_hastepics.py::test_speedup_motor_PV
        type: Function
        lineno: 183
      -   nodeid: tests/test_utils_hastepics.py::test_motor_init_list_attrs_created
        type: Function
        lineno: 205
      -   nodeid: tests/test_utils_hastepics.py::test_motor_extras_attrs_correct
        type: Function
        lineno: 216
      -   nodeid: tests/test_utils_hastepics.py::test_motor_callbacks_empty
        type: Function
        lineno: 228
      
    • tests/test_utils_ipy.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_ipy.py::test_devices_repr_fallback_and_ignore
        type: Function
        lineno: 19
      
    • tests/test_utils_jsonext.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_jsonext.py::test_json_validate_save_load[input_obj0-expected0]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_jsonext.py::test_json_validate_save_load[input_obj1-42]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_jsonext.py::test_json_validate_save_load[(1-1j)-expected2]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_jsonext.py::test_json_validate_save_load[input_obj3-/tmp/file.txt]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_jsonext.py::test_json_validate_save_load[input_obj4-expected4]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_jsonext.py::test_json_validate_save_load[input_obj5-expected5]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_jsonext.py::test_json_validate_save_load[input_obj6-expected6]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_jsonext.py::test_json_validate_save_load[input_obj7-expected7]
        type: Function
        lineno: 7
      
    • tests/test_utils_lazypv.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_lazypv.py::test_getattr
        type: Function
        lineno: 7
      
    • tests/test_utils_logcfg.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_logcfg.py::test_custom_log_outputs[LONG-<lambda>-This is a LONG message]
        type: Function
        lineno: 21
      -   nodeid: tests/test_utils_logcfg.py::test_custom_log_outputs[ENLARGE-<lambda>-Please ENLARGE this!]
        type: Function
        lineno: 21
      -   nodeid: tests/test_utils_logcfg.py::test_import_logging_once_per_module
        type: Function
        lineno: 51
      
    • tests/test_utils_logign.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_logign.py::test_ignore_log_msg_behavior[WARNING-This should be ignored-This should appear]
        type: Function
        lineno: 9
      -   nodeid: tests/test_utils_logign.py::test_ignore_log_msg_behavior[ENLARGE-ENLARGE this-Keep this ENLARGE]
        type: Function
        lineno: 9
      -   nodeid: tests/test_utils_logign.py::test_ignore_only_by_level
        type: Function
        lineno: 42
      -   nodeid: tests/test_utils_logign.py::test_ignore_only_by_msg
        type: Function
        lineno: 64
      -   nodeid: tests/test_utils_logign.py::test_filter_removed_after_context
        type: Function
        lineno: 86
      
    • tests/test_utils_marker.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_marker.py::test_format_value_with_units
        type: Function
        lineno: 30
      -   nodeid: tests/test_utils_marker.py::test_format_value_without_units
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_marker.py::test_marker_name_default
        type: Function
        lineno: 39
      -   nodeid: tests/test_utils_marker.py::test_marker_name_custom
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_marker.py::test_marker_repr_format
        type: Function
        lineno: 49
      -   nodeid: tests/test_utils_marker.py::test_marker_update_changes_value
        type: Function
        lineno: 56
      -   nodeid: tests/test_utils_marker.py::test_marker_update_with_explicit_value
        type: Function
        lineno: 63
      -   nodeid: tests/test_utils_marker.py::test_marker_goto_sets_value_and_returns_result
        type: Function
        lineno: 69
      -   nodeid: tests/test_utils_marker.py::test_marker_call_is_alias_of_goto
        type: Function
        lineno: 77
      -   nodeid: tests/test_utils_marker.py::test_markers_register_and_access
        type: Function
        lineno: 87
      -   nodeid: tests/test_utils_marker.py::test_markers_repr_contains_all
        type: Function
        lineno: 103
      -   nodeid: tests/test_utils_marker.py::test_marker_registry_dict_is_printable_dict
        type: Function
        lineno: 114
      -   nodeid: tests/test_utils_marker.py::test_markers_getitem_invalid_key_raises
        type: Function
        lineno: 122
      
    • tests/test_utils_metaclasses.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_metaclasses.py::test_combine_classes_combines_methods
        type: Function
        lineno: 14
      -   nodeid: tests/test_utils_metaclasses.py::test_registryabc_combines_registrymeta_and_abcmeta
        type: Function
        lineno: 25
      
    • tests/test_utils_namespace.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_namespace.py::test_namespace_pretty_repr_mixed_and_nested
        type: Function
        lineno: 4
      
    • tests/test_utils_npy.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_npy.py::test_nice_arange[0-5-1-expected0]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_npy.py::test_nice_arange[5-0--1-expected1]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_npy.py::test_nice_arange[1-2-0.3-expected2]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_npy.py::test_nice_arange[-2-2-1.5-expected3]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_npy.py::test_nice_arange[2.5-0.5--0.4-expected4]
        type: Function
        lineno: 7
      -   nodeid: tests/test_utils_npy.py::test_nice_linspace[0-10-4-expected0]
        type: Function
        lineno: 18
      -   nodeid: tests/test_utils_npy.py::test_nice_linspace[5-15-2-expected1]
        type: Function
        lineno: 18
      -   nodeid: tests/test_utils_npy.py::test_nice_linspace[-5-5-4-expected2]
        type: Function
        lineno: 18
      -   nodeid: tests/test_utils_npy.py::test_nice_linspace[0-1-3-expected3]
        type: Function
        lineno: 18
      -   nodeid: tests/test_utils_npy.py::test_nice_linspace[2-2-3-expected4]
        type: Function
        lineno: 18
      -   nodeid: tests/test_utils_npy.py::test_nice_linspace[3-0-3-expected5]
        type: Function
        lineno: 18
      -   nodeid: tests/test_utils_npy.py::test_nice_linspace[0-1-0-expected6]
        type: Function
        lineno: 18
      -   nodeid: tests/test_utils_npy.py::test_nice_linspace[-2-2-3-expected7]
        type: Function
        lineno: 18
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_centered[-2-2-2-True-expected0]
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_centered[0-5-2-True-expected1]
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_centered[0-5-2-False-expected2]
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_centered[-1-2-1.5-True-expected3]
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_centered[-1-2--1.5-True-expected4]
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_centered[5-0--2-True-expected5]
        type: Function
        lineno: 33
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_left_aligned[0-5-2-True-expected0]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_left_aligned[0-5-2-False-expected1]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_left_aligned[-1-2-1.5-True-expected2]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_left_aligned[-1-2-1.5-False-expected3]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_left_aligned[-2-1-1.2-True-expected4]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_left_aligned[5-0--2-True-expected5]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_left_aligned[5-0--2-False-expected6]
        type: Function
        lineno: 46
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_right_aligned[0-5-2-True-expected0]
        type: Function
        lineno: 60
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_right_aligned[0-5-2-False-expected1]
        type: Function
        lineno: 60
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_right_aligned[-1-2-1.5-True-expected2]
        type: Function
        lineno: 60
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_right_aligned[-1-2-1.5-False-expected3]
        type: Function
        lineno: 60
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_right_aligned[5-0--2-True-expected4]
        type: Function
        lineno: 60
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_right_aligned[5-0--2-False-expected5]
        type: Function
        lineno: 60
      -   nodeid: tests/test_utils_npy.py::test_nice_steps_right_aligned[-3-3-2-True-expected6]
        type: Function
        lineno: 60
      -   nodeid: tests/test_utils_npy.py::test_within_scalar[5-0-10-True]
        type: Function
        lineno: 74
      -   nodeid: tests/test_utils_npy.py::test_within_scalar[5-6-10-False]
        type: Function
        lineno: 74
      -   nodeid: tests/test_utils_npy.py::test_within_scalar[5-None-10-True]
        type: Function
        lineno: 74
      -   nodeid: tests/test_utils_npy.py::test_within_scalar[5-0-None-True]
        type: Function
        lineno: 74
      -   nodeid: tests/test_utils_npy.py::test_within_scalar[5-None-None-True]
        type: Function
        lineno: 74
      -   nodeid: tests/test_utils_npy.py::test_within_fraction[data0-2-5-0.6]
        type: Function
        lineno: 85
      -   nodeid: tests/test_utils_npy.py::test_within_fraction[data1-5-25-0.6666666666666666]
        type: Function
        lineno: 85
      -   nodeid: tests/test_utils_npy.py::test_within_fraction[data2-None-2-0.3333333333333333]
        type: Function
        lineno: 85
      -   nodeid: tests/test_utils_npy.py::test_within_fraction[data3-0-1-0]
        type: Function
        lineno: 85
      -   nodeid: tests/test_utils_npy.py::test_fraction_to_percentage[0.456-1-45.6]
        type: Function
        lineno: 96
      -   nodeid: tests/test_utils_npy.py::test_fraction_to_percentage[0.12345-2-12.35]
        type: Function
        lineno: 96
      -   nodeid: tests/test_utils_npy.py::test_fraction_to_percentage[0.9999-0-100.0]
        type: Function
        lineno: 96
      -   nodeid: tests/test_utils_npy.py::test_get_dtype[val0-ndarray]
        type: Function
        lineno: 105
      -   nodeid: tests/test_utils_npy.py::test_get_dtype[val1-list]
        type: Function
        lineno: 105
      -   nodeid: tests/test_utils_npy.py::test_get_dtype[3.14-float]
        type: Function
        lineno: 105
      -   nodeid: tests/test_utils_npy.py::test_get_shape[val0-expected0]
        type: Function
        lineno: 118
      -   nodeid: tests/test_utils_npy.py::test_get_shape[val1-expected1]
        type: Function
        lineno: 118
      -   nodeid: tests/test_utils_npy.py::test_get_shape[42-expected2]
        type: Function
        lineno: 118
      -   nodeid: tests/test_utils_npy.py::test_is_array[val0-True]
        type: Function
        lineno: 127
      -   nodeid: tests/test_utils_npy.py::test_is_array[val1-False]
        type: Function
        lineno: 127
      -   nodeid: tests/test_utils_npy.py::test_is_array[42-False]
        type: Function
        lineno: 127
      
    • tests/test_utils_opmsg.py
      • Outcome: passed
      • result:
      []
      
    • tests/test_utils_path.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_path.py::test_can_create_all_files_user_says_yes
        type: Function
        lineno: 10
      -   nodeid: tests/test_utils_path.py::test_can_create_all_files_user_says_no
        type: Function
        lineno: 36
      -   nodeid: tests/test_utils_path.py::test_make_missing_dir_creates_folder
        type: Function
        lineno: 54
      -   nodeid: tests/test_utils_path.py::test_glob_files_returns_matching_files_only
        type: Function
        lineno: 66
      -   nodeid: tests/test_utils_path.py::test_filter_files_excludes_directories
        type: Function
        lineno: 83
      
    • tests/test_utils_picklio.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_picklio.py::test_pickle_and_unpickle[test_obj0]
        type: Function
        lineno: 6
      -   nodeid: tests/test_utils_picklio.py::test_pickle_and_unpickle[test_obj1]
        type: Function
        lineno: 6
      -   nodeid: tests/test_utils_picklio.py::test_pickle_and_unpickle[simple string]
        type: Function
        lineno: 6
      -   nodeid: tests/test_utils_picklio.py::test_pickle_and_unpickle[42]
        type: Function
        lineno: 6
      -   nodeid: tests/test_utils_picklio.py::test_pickle_and_unpickle[3.14159]
        type: Function
        lineno: 6
      -   nodeid: tests/test_utils_picklio.py::test_pickle_and_unpickle[test_obj5]
        type: Function
        lineno: 6
      -   nodeid: tests/test_utils_picklio.py::test_pickle_and_unpickle[test_obj6]
        type: Function
        lineno: 6
      
    • tests/test_utils_printing.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_printing.py::test_maxlen_valid[seq0-3]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_printing.py::test_maxlen_valid[seq1-0]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_printing.py::test_maxlen_valid[seq2-3]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_printing.py::test_maxlen_valid[seq3-2]
        type: Function
        lineno: 8
      -   nodeid: tests/test_utils_printing.py::test_strlen[42-2]
        type: Function
        lineno: 17
      -   nodeid: tests/test_utils_printing.py::test_strlen[hello-5]
        type: Function
        lineno: 17
      -   nodeid: tests/test_utils_printing.py::test_strlen[False-5]
        type: Function
        lineno: 17
      -   nodeid: tests/test_utils_printing.py::test_strlen[None-4]
        type: Function
        lineno: 17
      -   nodeid: tests/test_utils_printing.py::test_strlen[value4-9]
        type: Function
        lineno: 17
      -   nodeid: tests/test_utils_printing.py::test_strlen[value5-8]
        type: Function
        lineno: 17
      -   nodeid: tests/test_utils_printing.py::test_strlen[value6-6]
        type: Function
        lineno: 17
      -   nodeid: tests/test_utils_printing.py::test_strlen[-0]
        type: Function
        lineno: 17
      -   nodeid: tests/test_utils_printing.py::test_strlen[this is a phrase-16]
        type: Function
        lineno: 17
      -   nodeid: tests/test_utils_printing.py::test_maxstrlen[seq0-6]
        type: Function
        lineno: 31
      -   nodeid: tests/test_utils_printing.py::test_maxstrlen[seq1-3]
        type: Function
        lineno: 31
      -   nodeid: tests/test_utils_printing.py::test_maxstrlen[seq2-9]
        type: Function
        lineno: 31
      -   nodeid: tests/test_utils_printing.py::test_maxstrlen[seq3-16]
        type: Function
        lineno: 31
      -   nodeid: tests/test_utils_printing.py::test_maxstrlen[seq4-5]
        type: Function
        lineno: 31
      -   nodeid: tests/test_utils_printing.py::test_transpose_matrix[data0-expected0]
        type: Function
        lineno: 41
      -   nodeid: tests/test_utils_printing.py::test_transpose_matrix[data1-expected1]
        type: Function
        lineno: 41
      -   nodeid: tests/test_utils_printing.py::test_transpose_matrix[data2-expected2]
        type: Function
        lineno: 41
      -   nodeid: tests/test_utils_printing.py::test_prepend[initial0-1-expected0]
        type: Function
        lineno: 50
      -   nodeid: tests/test_utils_printing.py::test_prepend[initial1-a-expected1]
        type: Function
        lineno: 50
      -   nodeid: tests/test_utils_printing.py::test_prepend[initial2-prepend2-expected2]
        type: Function
        lineno: 50
      -   nodeid: tests/test_utils_printing.py::test_prepend[initial3-prepend3-expected3]
        type: Function
        lineno: 50
      -   nodeid: tests/test_utils_printing.py::test_fmt_table_line[entries0-widths0-  a   bbb]
        type: Function
        lineno: 61
      -   nodeid: tests/test_utils_printing.py::test_fmt_table_line[entries1-widths1- 1  2]
        type: Function
        lineno: 61
      -   nodeid: tests/test_utils_printing.py::test_fmt_table_line[entries2-widths2-  long  val]
        type: Function
        lineno: 61
      -   nodeid: tests/test_utils_printing.py::test_fmt_table_line[entries3-widths3- True  False]
        type: Function
        lineno: 61
      -   nodeid: tests/test_utils_printing.py::test_fmt_table_line[entries4-widths4-  123  4567]
        type: Function
        lineno: 61
      -   nodeid: tests/test_utils_printing.py::test_fmt_table_line[entries5-widths5- text with space   end]
        type: Function
        lineno: 61
      -   nodeid: tests/test_utils_printing.py::test_fmt_table_line[entries6-widths6-  {'a': 1}   {'b': 2}]
        type: Function
        lineno: 61
      -   nodeid: tests/test_utils_printing.py::test_fmt_table_line[entries7-widths7-    [1, 2]     [3, 4]]
        type: Function
        lineno: 61
      -   nodeid: tests/test_utils_printing.py::test_fmt_label_sep[widths0------ ----]
        type: Function
        lineno: 74
      -   nodeid: tests/test_utils_printing.py::test_fmt_label_sep[widths1-=-== ===]
        type: Function
        lineno: 74
      -   nodeid: tests/test_utils_printing.py::test_fmt_label_sep[widths2-*-***** **]
        type: Function
        lineno: 74
      -   nodeid: tests/test_utils_printing.py::test_printable_dict_with_header[d0-HeaderTest-expected_lines0]
        type: Function
        lineno: 82
      -   nodeid: tests/test_utils_printing.py::test_printable_dict_of_dicts
        type: Function
        lineno: 101
      -   nodeid: tests/test_utils_printing.py::test_printable_table[data0-labels0-A: ID\nB: \u2713 Success?\nC: SuperPrecisionValue\nD: Result Metadata\n\n#             A     B          C                            D\n- ------------- ----- ---------- ----------------------------\n0            X1  True     0.1234               {'meta': 'ok'}\n1 AnotherSample False 98765.4321          {'meta': [1, 2, 3]}\n2             Z  None        0.0 {'meta': {'nested_key': 42}}]
        type: Function
        lineno: 128
      
    • tests/test_utils_pv.py
      • Outcome: passed
      • result:
      []
      
    • tests/test_utils_pvpreload.py
      • Outcome: passed
      • result:
      []
      
    • tests/test_utils_pyepics.py
      • Outcome: passed
      • result:
      []
      
    • tests/test_utils_rangebar.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_rangebar.py::test_full_progress_bar
        type: Function
        lineno: 14
      -   nodeid: tests/test_utils_rangebar.py::test_half_progress_bar
        type: Function
        lineno: 27
      -   nodeid: tests/test_utils_rangebar.py::test_zero_progress_bar
        type: Function
        lineno: 42
      -   nodeid: tests/test_utils_rangebar.py::test_overflow_bar
        type: Function
        lineno: 56
      -   nodeid: tests/test_utils_rangebar.py::test_underflow_bar
        type: Function
        lineno: 69
      -   nodeid: tests/test_utils_rangebar.py::test_repr
        type: Function
        lineno: 82
      -   nodeid: tests/test_utils_rangebar.py::test_each_value_separately[0-          ]
        type: Function
        lineno: 89
      -   nodeid: tests/test_utils_rangebar.py::test_each_value_separately[10-\u2588         ]
        type: Function
        lineno: 89
      -   nodeid: tests/test_utils_rangebar.py::test_each_value_separately[25-\u2588\u2588\u258c       ]
        type: Function
        lineno: 89
      -   nodeid: tests/test_utils_rangebar.py::test_each_value_separately[27-\u2588\u2588\u258a       ]
        type: Function
        lineno: 89
      -   nodeid: tests/test_utils_rangebar.py::test_each_value_separately[49-\u2588\u2588\u2588\u2588\u2589     ]
        type: Function
        lineno: 89
      -   nodeid: tests/test_utils_rangebar.py::test_each_value_separately[50-\u2588\u2588\u2588\u2588\u2588     ]
        type: Function
        lineno: 89
      -   nodeid: tests/test_utils_rangebar.py::test_each_value_separately[51-\u2588\u2588\u2588\u2588\u2588\u258f    ]
        type: Function
        lineno: 89
      -   nodeid: tests/test_utils_rangebar.py::test_each_value_separately[73-\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258e  ]
        type: Function
        lineno: 89
      -   nodeid: tests/test_utils_rangebar.py::test_each_value_separately[75-\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258c  ]
        type: Function
        lineno: 89
      -   nodeid: tests/test_utils_rangebar.py::test_each_value_separately[90-\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 ]
        type: Function
        lineno: 89
      -   nodeid: tests/test_utils_rangebar.py::test_each_value_separately[100-\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588]
        type: Function
        lineno: 89
      
    • tests/test_utils_readable.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[59.4-59 seconds]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[59.9-60 seconds]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[119.9-120 seconds]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[120.1-2 minutes]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[3599.9-60 minutes]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[3600.1-60 minutes]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[7199.9-120 minutes]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[7200.1-2 hours]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[90.4-90 seconds]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[90.6-91 seconds]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[121.9-2 minutes]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[1296000.0-2 weeks]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[2592000.0-4 weeks]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[2800000.0-5 weeks]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[3888000.0-6 weeks]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[5097600.0-8 weeks]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[5184000.0-9 weeks]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[5270400.0-2 months]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[23328000.0-9 months]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[31104000.0-12 months]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[33696000.0-13 months]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[59616000.0-23 months]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[62208000.0-24 months]
        type: Function
        lineno: 3
      -   nodeid: tests/test_utils_readable.py::test_readable_seconds[64208000.0-2 years]
        type: Function
        lineno: 3
      
    • tests/test_utils_registry.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_registry.py::test_metaclass_creates_weakset
        type: Function
        lineno: 13
      -   nodeid: tests/test_utils_registry.py::test_metaclass_tracks_instances
        type: Function
        lineno: 22
      -   nodeid: tests/test_utils_registry.py::test_registry_inheritance
        type: Function
        lineno: 32
      -   nodeid: tests/test_utils_registry.py::test_instance_tracking
        type: Function
        lineno: 39
      -   nodeid: tests/test_utils_registry.py::test_collect_instances_recursive
        type: Function
        lineno: 53
      -   nodeid: tests/test_utils_registry.py::test_instances_function
        type: Function
        lineno: 69
      -   nodeid: tests/test_utils_registry.py::test_non_registry_class_error
        type: Function
        lineno: 93
      -   nodeid: tests/test_utils_registry.py::test_signature_preservation
        type: Function
        lineno: 102
      
    • tests/test_utils_reprate.py
      • Outcome: passed
      • result:
      []
      
    • tests/test_utils_richcfg.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_richcfg.py::test_rich_inspector_outputs_more_than_builtin
        type: Function
        lineno: 45
      
    • tests/test_utils_run_later.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_run_later.py::test_init_and_repr
        type: Function
        lineno: 17
      -   nodeid: tests/test_utils_run_later.py::test_call
        type: Function
        lineno: 22
      -   nodeid: tests/test_utils_run_later.py::test_matmul_with_string
        type: Function
        lineno: 27
      -   nodeid: tests/test_utils_run_later.py::test_matmul_with_list
        type: Function
        lineno: 32
      -   nodeid: tests/test_utils_run_later.py::test_matmul_with_single_int
        type: Function
        lineno: 37
      -   nodeid: tests/test_utils_run_later.py::test_run_at_future_triggered_and_logs
        type: Function
        lineno: 49
      -   nodeid: tests/test_utils_run_later.py::test_run_at_already_past
        type: Function
        lineno: 61
      -   nodeid: tests/test_utils_run_later.py::test_run_in_future_triggered_and_logs
        type: Function
        lineno: 72
      -   nodeid: tests/test_utils_run_later.py::test_run_in_past
        type: Function
        lineno: 83
      -   nodeid: tests/test_utils_run_later.py::test_run_later_with_seconds
        type: Function
        lineno: 95
      -   nodeid: tests/test_utils_run_later.py::test_run_later_with_past_datetime
        type: Function
        lineno: 105
      -   nodeid: tests/test_utils_run_later.py::test_run_at_tqdm_multiple_updates
        type: Function
        lineno: 115
      -   nodeid: tests/test_utils_run_later.py::test_today_basic
        type: Function
        lineno: 137
      -   nodeid: tests/test_utils_run_later.py::test_tomorrow_basic
        type: Function
        lineno: 143
      -   nodeid: tests/test_utils_run_later.py::test_yesterday_basic
        type: Function
        lineno: 149
      -   nodeid: tests/test_utils_run_later.py::test_today_matmul_string
        type: Function
        lineno: 155
      -   nodeid: tests/test_utils_run_later.py::test_tomorrow_matmul_list
        type: Function
        lineno: 161
      -   nodeid: tests/test_utils_run_later.py::test_yesterday_matmul_single
        type: Function
        lineno: 167
      
    • tests/test_utils_sendmail.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_sendmail.py::test_sendmail_local_delivery
        type: Function
        lineno: 13
      -   nodeid: tests/test_utils_sendmail.py::test_sendmail_raises_on_sendmail_failure
        type: Function
        lineno: 60
      
    • tests/test_utils_sendsms.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_sendsms.py::test_sendsms_local_delivery
        type: Function
        lineno: 6
      
    • tests/test_utils_shortcut.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_shortcut.py::TestShortcutInitialization
        type: Class
      -   nodeid: tests/test_utils_shortcut.py::test_run_method
        type: Function
        lineno: 31
      -   nodeid: tests/test_utils_shortcut.py::test_repr_output
        type: Function
        lineno: 54
      -   nodeid: tests/test_utils_shortcut.py::test_source_with_regular_function
        type: Function
        lineno: 62
      -   nodeid: tests/test_utils_shortcut.py::test_source_error_handling
        type: Function
        lineno: 76
      -   nodeid: tests/test_utils_shortcut.py::test_as_shortcut_basic
        type: Function
        lineno: 86
      -   nodeid: tests/test_utils_shortcut.py::test_as_shortcut_with_name
        type: Function
        lineno: 96
      -   nodeid: tests/test_utils_shortcut.py::test_as_shortcut_factory_pattern
        type: Function
        lineno: 104
      -   nodeid: tests/test_utils_shortcut.py::TestShortcutsSingleton
        type: Class
      -   nodeid: tests/test_utils_shortcut.py::TestFullIntegration
        type: Class
      -   nodeid: tests/test_utils_shortcut.py::test_registry_inheritance
        type: Function
        lineno: 204
      
    • tests/test_utils_shortcut.py::TestFullIntegration
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_shortcut.py::TestFullIntegration::test_workflow
        type: Function
        lineno: 170
      -   nodeid: tests/test_utils_shortcut.py::TestFullIntegration::test_multiple_shortcuts
        type: Function
        lineno: 190
      
    • tests/test_utils_shortcut.py::TestShortcutInitialization
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_shortcut.py::TestShortcutInitialization::test_init_with_custom_name
        type: Function
        lineno: 16
      -   nodeid: tests/test_utils_shortcut.py::TestShortcutInitialization::test_init_without_name
        type: Function
        lineno: 23
      
    • tests/test_utils_shortcut.py::TestShortcutsSingleton
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_shortcut.py::TestShortcutsSingleton::test_singleton_behavior
        type: Function
        lineno: 121
      -   nodeid: tests/test_utils_shortcut.py::TestShortcutsSingleton::test_registration
        type: Function
        lineno: 127
      -   nodeid: tests/test_utils_shortcut.py::TestShortcutsSingleton::test_getitem_access
        type: Function
        lineno: 141
      -   nodeid: tests/test_utils_shortcut.py::TestShortcutsSingleton::test_missing_key
        type: Function
        lineno: 149
      -   nodeid: tests/test_utils_shortcut.py::TestShortcutsSingleton::test_repr_output
        type: Function
        lineno: 154
      
    • tests/test_utils_snapshot.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_snapshot.py::test_snapshot[exclude_internals]
        type: Function
        lineno: 83
      -   nodeid: tests/test_utils_snapshot.py::test_snapshot[include_internals]
        type: Function
        lineno: 83
      -   nodeid: tests/test_utils_snapshot.py::test_snapshot[empty_case]
        type: Function
        lineno: 83
      -   nodeid: tests/test_utils_snapshot.py::test_snapshot[sort_str]
        type: Function
        lineno: 83
      -   nodeid: tests/test_utils_snapshot.py::test_snapshot[sort_id]
        type: Function
        lineno: 83
      -   nodeid: tests/test_utils_snapshot.py::test_snapshot[sort_case_insensitive]
        type: Function
        lineno: 83
      -   nodeid: tests/test_utils_snapshot.py::test_snapshot[sort_length]
        type: Function
        lineno: 83
      -   nodeid: tests/test_utils_snapshot.py::test_snapshot[sort_reverse]
        type: Function
        lineno: 83
      
    • tests/test_utils_termtitle.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_termtitle.py::test_terminal_title_with_tmux
        type: Function
        lineno: 9
      
    • tests/test_utils_tqdm_mod.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_tqdm_mod.py::test_complete_progress_bar
        type: Function
        lineno: 25
      -   nodeid: tests/test_utils_tqdm_mod.py::test_set_progress_multiple_points
        type: Function
        lineno: 42
      -   nodeid: tests/test_utils_tqdm_mod.py::test_format_sizeof_alignment
        type: Function
        lineno: 65
      -   nodeid: tests/test_utils_tqdm_mod.py::test_float_alignment_in_bar
        type: Function
        lineno: 83
      -   nodeid: tests/test_utils_tqdm_mod.py::test_custom_unit
        type: Function
        lineno: 132
      -   nodeid: tests/test_utils_tqdm_mod.py::test_clamp_above_total
        type: Function
        lineno: 146
      -   nodeid: tests/test_utils_tqdm_mod.py::test_clamp_below_zero
        type: Function
        lineno: 163
      
    • tests/test_utils_trinary.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_trinary.py::test_check_trinary_valid_values
        type: Function
        lineno: 6
      -   nodeid: tests/test_utils_trinary.py::test_check_trinary_invalid_value
        type: Function
        lineno: 14
      -   nodeid: tests/test_utils_trinary.py::test_check_trinary_with_custom_allowed_values
        type: Function
        lineno: 22
      
    • tests/test_utils_typecast.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_typecast.py::test_downcast_success
        type: Function
        lineno: 24
      -   nodeid: tests/test_utils_typecast.py::test_upcast_success
        type: Function
        lineno: 30
      -   nodeid: tests/test_utils_typecast.py::test_downcast_invalid
        type: Function
        lineno: 41
      -   nodeid: tests/test_utils_typecast.py::test_upcast_invalid
        type: Function
        lineno: 48
      -   nodeid: tests/test_utils_typecast.py::test_object_identity_preserved
        type: Function
        lineno: 53
      -   nodeid: tests/test_utils_typecast.py::test_ensure_subclass_valid
        type: Function
        lineno: 64
      -   nodeid: tests/test_utils_typecast.py::test_ensure_subclass_invalid
        type: Function
        lineno: 67
      -   nodeid: tests/test_utils_typecast.py::test_cast_changes_class
        type: Function
        lineno: 79
      -   nodeid: tests/test_utils_typecast.py::test_cast_preserves_identity
        type: Function
        lineno: 86
      
    • tests/test_utils_utils.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_utils.py::test_singleton_instance
        type: Function
        lineno: 17
      -   nodeid: tests/test_utils_utils.py::test_singleton_identity
        type: Function
        lineno: 25
      -   nodeid: tests/test_utils_utils.py::test_typename[None-NoneType]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[True-bool]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[42-int]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[3.14-float]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[text-str]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[obj5-set]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[obj6-list]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[obj7-list]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[obj8-dict]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[<lambda>-function]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[sample_function-function]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[nested-function]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[len-builtin_function_or_method]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[sum-builtin_function_or_method]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[math-module]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[sys-module]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[function-type]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[<genexpr>-generator]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_typename[obj18-list_iterator]
        type: Function
        lineno: 44
      -   nodeid: tests/test_utils_utils.py::test_next_int[nums0-4]
        type: Function
        lineno: 77
      -   nodeid: tests/test_utils_utils.py::test_next_int[nums1-21]
        type: Function
        lineno: 77
      -   nodeid: tests/test_utils_utils.py::test_next_int[nums2-0]
        type: Function
        lineno: 77
      -   nodeid: tests/test_utils_utils.py::test_zero_pad[7-3-007]
        type: Function
        lineno: 87
      -   nodeid: tests/test_utils_utils.py::test_zero_pad[123-5-00123]
        type: Function
        lineno: 87
      -   nodeid: tests/test_utils_utils.py::test_zero_pad[0-2-00]
        type: Function
        lineno: 87
      -   nodeid: tests/test_utils_utils.py::test_iround[3.6-4]
        type: Function
        lineno: 97
      -   nodeid: tests/test_utils_utils.py::test_iround[2.1-2]
        type: Function
        lineno: 97
      -   nodeid: tests/test_utils_utils.py::test_iround[-1.5--2]
        type: Function
        lineno: 97
      -   nodeid: tests/test_utils_utils.py::test_iround[-1.4--1]
        type: Function
        lineno: 97
      -   nodeid: tests/test_utils_utils.py::test_sorted_naturally[items0-expected0]
        type: Function
        lineno: 108
      -   nodeid: tests/test_utils_utils.py::test_sorted_naturally[items1-expected1]
        type: Function
        lineno: 108
      -   nodeid: tests/test_utils_utils.py::test_sorted_naturally_reverse[items0-expected0]
        type: Function
        lineno: 115
      
    • tests/test_utils_xrange.py
      • Outcome: passed
      • result:
      -   nodeid: tests/test_utils_xrange.py::test_xrange_finite[args0-kwargs0-expected0]
        type: Function
        lineno: 11
      -   nodeid: tests/test_utils_xrange.py::test_xrange_finite[args1-kwargs1-expected1]
        type: Function
        lineno: 11
      -   nodeid: tests/test_utils_xrange.py::test_xrange_finite[args2-kwargs2-expected2]
        type: Function
        lineno: 11
      -   nodeid: tests/test_utils_xrange.py::test_xrange_finite[args3-kwargs3-expected3]
        type: Function
        lineno: 11
      -   nodeid: tests/test_utils_xrange.py::test_xrange_infinite[args0-kwargs0-count(0)]
        type: Function
        lineno: 20
      -   nodeid: tests/test_utils_xrange.py::test_xrange_infinite[args1-kwargs1-count(0, 2)]
        type: Function
        lineno: 20
      -   nodeid: tests/test_utils_xrange.py::test_xrange_too_many_args[args0]
        type: Function
        lineno: 31
      
. (1 tests)
  • .
    • Outcome: passed
    • result:
    -   nodeid: ci-reports
      type: Dir
    -   nodeid: markdown
      type: Dir
    -   nodeid: morbidissimo
      type: Dir
    -   nodeid: outputs
      type: Dir
    -   nodeid: slic
      type: Package
    -   nodeid: temp-ci
      type: Dir
    -   nodeid: test-ci
      type: Dir
    -   nodeid: tests
      type: Dir
    

⚠️ Warnings

Warnings nº1
message: invalid escape sequence \-
category: DeprecationWarning
when: collect
filename: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/bsread/h5.py
lineno: 207
Warnings nº2
message: The module numpy.dual is deprecated.  Instead of using dual, use the functions directly from numpy or scipy.
category: DeprecationWarning
when: collect
filename: /workspace/tligui_y/slic/.pixi/envs/default/lib/python3.8/site-packages/scipy/fft/__init__.py
lineno: 97
Warnings nº3
message: invalid escape sequence \[
category: DeprecationWarning
when: collect
filename: /workspace/tligui_y/slic/tests/test_utils_pv.py
lineno: 12