bond-spy 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/bond_reconcile.py +224 -134
- data/bond.gemspec +2 -1
- data/lib/bond.rb +53 -35
- data/lib/bond/targetable.rb +9 -3
- data/lib/bond/version.rb +1 -1
- data/spec/bond_spec.rb +16 -0
- data/spec/bond_targetable_spec.rb +13 -0
- data/spec/test_observations/bond_spec/Bond_with_agents_should_call_doers_before_returning_result.json +4 -4
- data/spec/test_observations/bond_spec/Bond_with_agents_should_call_the_function_passed_as_result_if_it_is_callable.json +9 -9
- data/spec/test_observations/bond_spec/Bond_with_agents_should_correctly_call_a_single_doer_if_filter_criteria_are_met.json +4 -4
- data/spec/test_observations/bond_spec/Bond_with_agents_should_correctly_call_multiple_doers.json +5 -5
- data/spec/test_observations/bond_spec/Bond_with_agents_should_not_call_doers_of_overriden_agents.json +2 -2
- data/spec/test_observations/bond_spec/Bond_with_agents_should_skip_saving_observations_when_specified.json +18 -0
- data/spec/test_observations/bond_spec/Bond_with_agents_should_throw_an_exception_if_specified_by_agent.json +3 -3
- data/spec/test_observations/bond_spec/Bond_with_agents_should_throw_the_result_of_the_value_passed_to_exception_if_callable.json +4 -4
- data/spec/test_observations/bond_spec/Bond_with_agents_should_work_with_multiple_agents_for_different_spy_points.json +9 -9
- data/spec/test_observations/bond_spec/Bond_with_agents_with_filters_should_respect_combinations_of_filters.json +19 -19
- data/spec/test_observations/bond_spec/Bond_with_agents_with_filters_should_respect_function_filters.json +6 -6
- data/spec/test_observations/bond_spec/Bond_with_agents_with_filters_should_respect_single_key_value_filters_of_all_types.json +51 -51
- data/spec/test_observations/bond_spec/Bond_without_any_agents_should_correctly_log_nested_hashes_and_arrays_with_hash_sorting.json +22 -22
- data/spec/test_observations/bond_spec/Bond_without_any_agents_should_correctly_log_some_normal_arguments_with_a_spy_point_name.json +6 -6
- data/spec/test_observations/bond_spec/Bond_without_any_agents_should_correctly_log_some_normal_arguments_without_a_spy_point_name.json +4 -4
- data/spec/test_observations/bond_targetable_spec/BondTargetable_correctly_continues_to_the_method_when_agent_result_continue_is_returned.json +4 -4
- data/spec/test_observations/bond_targetable_spec/BondTargetable_correctly_continues_to_the_method_when_agent_result_none_is_returned.json +6 -6
- data/spec/test_observations/bond_targetable_spec/BondTargetable_correctly_spies_private_methods.json +2 -2
- data/spec/test_observations/bond_targetable_spec/BondTargetable_correctly_spies_protected_methods.json +2 -2
- data/spec/test_observations/bond_targetable_spec/BondTargetable_with_different_argument_types_correctly_spies_on_a_class_method.json +3 -3
- data/spec/test_observations/bond_targetable_spec/BondTargetable_with_different_argument_types_correctly_spies_on_a_normal_method.json +3 -3
- data/spec/test_observations/bond_targetable_spec/BondTargetable_with_different_argument_types_correctly_spies_on_all_optional_keyword_arguments.json +4 -4
- data/spec/test_observations/bond_targetable_spec/BondTargetable_with_different_argument_types_correctly_spies_on_variable_keyword_arguments.json +12 -12
- data/spec/test_observations/bond_targetable_spec/BondTargetable_with_different_spy_point_parameters_correctly_ignores_excluded_keys.json +4 -4
- data/spec/test_observations/bond_targetable_spec/BondTargetable_with_different_spy_point_parameters_correctly_mocks_when_one_is_specified.json +4 -4
- data/spec/test_observations/bond_targetable_spec/BondTargetable_with_different_spy_point_parameters_correctly_respects_mock_only.json +17 -0
- data/spec/test_observations/bond_targetable_spec/BondTargetable_with_modules_correctly_spies_on_included_module_methods.json +2 -2
- data/spec/test_observations/bond_targetable_spec/BondTargetable_with_modules_correctly_spies_on_module_methods.json +3 -3
- data/tutorials/binary_search_tree/bst_spec.rb +1 -5
- data/tutorials/binary_search_tree/run_tests.sh +1 -1
- data/tutorials/heat_watcher/heat_watcher.rb +2 -2
- data/tutorials/heat_watcher/heat_watcher_spec.rb +8 -13
- data/tutorials/heat_watcher/test_observations/heat_watcher_spec/HeatWatcher_should_properly_report_critical_errors.json +7 -49
- data/tutorials/heat_watcher/test_observations/heat_watcher_spec/HeatWatcher_should_properly_report_warnings_and_switch_back_to_OK_status.json +9 -63
- metadata +20 -2
| @@ -1,10 +1,10 @@ | |
| 1 1 | 
             
            [
         | 
| 2 2 | 
             
            {
         | 
| 3 | 
            -
             | 
| 3 | 
            +
                "__spy_point__": "TestClass#annotated_method_kw_params_optional"
         | 
| 4 4 | 
             
            },
         | 
| 5 5 | 
             
            {
         | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 6 | 
            +
                "__spy_point__": "TestClass#annotated_method_kw_params_optional",
         | 
| 7 | 
            +
                "arg1": "value1",
         | 
| 8 | 
            +
                "arg2": "value2"
         | 
| 9 9 | 
             
            }
         | 
| 10 10 | 
             
            ]
         | 
| @@ -1,22 +1,22 @@ | |
| 1 1 | 
             
            [
         | 
| 2 2 | 
             
            {
         | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 3 | 
            +
                "__spy_point__": "TestClass#annotated_method_variable_kw_args",
         | 
| 4 | 
            +
                "arg1": "value1"
         | 
| 5 5 | 
             
            },
         | 
| 6 6 | 
             
            {
         | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 7 | 
            +
                "__spy_point__": "TestClass#annotated_method_variable_kw_args",
         | 
| 8 | 
            +
                "arg1": "value1",
         | 
| 9 | 
            +
                "arg2": "value2"
         | 
| 10 10 | 
             
            },
         | 
| 11 11 | 
             
            {
         | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 12 | 
            +
                "__spy_point__": "TestClass#annotated_method_variable_kw_args",
         | 
| 13 | 
            +
                "arg1": "value1",
         | 
| 14 | 
            +
                "arg3": "value3"
         | 
| 15 15 | 
             
            },
         | 
| 16 16 | 
             
            {
         | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 17 | 
            +
                "__spy_point__": "TestClass#annotated_method_variable_kw_args",
         | 
| 18 | 
            +
                "arg1": "value1",
         | 
| 19 | 
            +
                "arg3": "value3",
         | 
| 20 | 
            +
                "arg4": "value4"
         | 
| 21 21 | 
             
            }
         | 
| 22 22 | 
             
            ]
         | 
| @@ -1,10 +1,10 @@ | |
| 1 1 | 
             
            [
         | 
| 2 2 | 
             
            {
         | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 3 | 
            +
                "__spy_point__": "TestClass#annotated_method_single_exclude",
         | 
| 4 | 
            +
                "arg2": "value2"
         | 
| 5 5 | 
             
            },
         | 
| 6 6 | 
             
            {
         | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 7 | 
            +
                "__spy_point__": "TestClass#annotated_method_multiple_exclude",
         | 
| 8 | 
            +
                "arg2": "value2"
         | 
| 9 9 | 
             
            }
         | 
| 10 10 | 
             
            ]
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            [
         | 
| 2 | 
            +
            {
         | 
| 3 | 
            +
                "__spy_point__": "unmocked_return",
         | 
| 4 | 
            +
                "val": "return"
         | 
| 5 | 
            +
            },
         | 
| 6 | 
            +
            {
         | 
| 7 | 
            +
                "__spy_point__": "mocked_return",
         | 
| 8 | 
            +
                "val": "mocked return"
         | 
| 9 | 
            +
            },
         | 
| 10 | 
            +
            {
         | 
| 11 | 
            +
                "__spy_point__": "mock_only"
         | 
| 12 | 
            +
            },
         | 
| 13 | 
            +
            {
         | 
| 14 | 
            +
                "__spy_point__": "mocked_return",
         | 
| 15 | 
            +
                "val": "mocked return"
         | 
| 16 | 
            +
            }
         | 
| 17 | 
            +
            ]
         | 
| @@ -67,7 +67,7 @@ class HeatWatcher | |
| 67 67 | 
             
              end
         | 
| 68 68 |  | 
| 69 69 | 
             
              # Spy this function, want to spy the result
         | 
| 70 | 
            -
              bond.spy_point(spy_result: true)
         | 
| 70 | 
            +
              bond.spy_point(spy_result: true, mock_only: true)
         | 
| 71 71 | 
             
              # Read the temperature from a sensor
         | 
| 72 72 | 
             
              def get_temperature
         | 
| 73 73 | 
             
                resp_code, temp_data =
         | 
| @@ -78,7 +78,7 @@ class HeatWatcher | |
| 78 78 | 
             
                match[1].to_f
         | 
| 79 79 | 
             
              end
         | 
| 80 80 |  | 
| 81 | 
            -
              bond.spy_point
         | 
| 81 | 
            +
              bond.spy_point(mock_only: true)
         | 
| 82 82 | 
             
              # Read the current time
         | 
| 83 83 | 
             
              def get_current_time
         | 
| 84 84 | 
             
                  Time.now.to_i
         | 
| @@ -89,28 +89,23 @@ class TemperatureMocker | |
| 89 89 | 
             
              def initialize(time_mocker:, temp_start:, temp_rates: [])
         | 
| 90 90 | 
             
                @time_mocker = time_mocker
         | 
| 91 91 | 
             
                @start_time = time_mocker.time
         | 
| 92 | 
            -
                @ | 
| 93 | 
            -
                @last_temp_time = @start_time  # last temp read time
         | 
| 92 | 
            +
                @temp_start = temp_start
         | 
| 94 93 | 
             
                @temp_rates = temp_rates
         | 
| 95 94 | 
             
              end
         | 
| 96 95 |  | 
| 97 96 | 
             
              def temperature
         | 
| 98 97 | 
             
                now = @time_mocker.time
         | 
| 99 98 | 
             
                time_since_start = now - @start_time
         | 
| 100 | 
            -
                # See if we need to advance to the next temperature rate
         | 
| 101 | 
            -
                if @temp_rates.length > 1 && time_since_start >= @temp_rates[1][0]
         | 
| 102 99 |  | 
| 103 | 
            -
             | 
| 100 | 
            +
                temp = @temp_start
         | 
| 101 | 
            +
                last_time, last_rate = @temp_rates[0]
         | 
| 104 102 |  | 
| 105 | 
            -
             | 
| 106 | 
            -
                   | 
| 107 | 
            -
                   | 
| 103 | 
            +
                @temp_rates[1..-1].each do |r_time, r_rate|
         | 
| 104 | 
            +
                  break if time_since_start <= r_time
         | 
| 105 | 
            +
                  temp += (r_time - last_time) * last_rate / 60.0
         | 
| 106 | 
            +
                  last_time, last_rate = r_time, r_rate
         | 
| 108 107 | 
             
                end
         | 
| 109 108 |  | 
| 110 | 
            -
                 | 
| 111 | 
            -
                rate = @temp_rates.length > 0 ? @temp_rates[0][1] : 0
         | 
| 112 | 
            -
                @last_temp += (now - @last_temp_time) / 60.0 * rate
         | 
| 113 | 
            -
                @last_temp_time = now
         | 
| 114 | 
            -
                @last_temp
         | 
| 109 | 
            +
                temp + (time_since_start - last_time) * last_rate / 60.0
         | 
| 115 110 | 
             
              end
         | 
| 116 111 | 
             
            end
         | 
| @@ -1,53 +1,35 @@ | |
| 1 1 | 
             
            [
         | 
| 2 | 
            -
            {
         | 
| 3 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 4 | 
            -
            },
         | 
| 5 2 | 
             
            {
         | 
| 6 3 | 
             
                "__spy_point__": "HeatWatcher#make_request",
         | 
| 7 4 | 
             
                "url": "http://system.server.com/temperature"
         | 
| 8 5 | 
             
            },
         | 
| 9 6 | 
             
            {
         | 
| 10 7 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 11 | 
            -
                "result": 70 | 
| 12 | 
            -
            },
         | 
| 13 | 
            -
            {
         | 
| 14 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 8 | 
            +
                "result": 70
         | 
| 15 9 | 
             
            },
         | 
| 16 10 | 
             
            {
         | 
| 17 11 | 
             
                "__spy_point__": "HeatWatcher#sleep",
         | 
| 18 12 | 
             
                "seconds": 60
         | 
| 19 13 | 
             
            },
         | 
| 20 | 
            -
            {
         | 
| 21 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 22 | 
            -
            },
         | 
| 23 14 | 
             
            {
         | 
| 24 15 | 
             
                "__spy_point__": "HeatWatcher#make_request",
         | 
| 25 16 | 
             
                "url": "http://system.server.com/temperature"
         | 
| 26 17 | 
             
            },
         | 
| 27 18 | 
             
            {
         | 
| 28 19 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 29 | 
            -
                "result": 70. | 
| 30 | 
            -
            },
         | 
| 31 | 
            -
            {
         | 
| 32 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 20 | 
            +
                "result": 70.5000
         | 
| 33 21 | 
             
            },
         | 
| 34 22 | 
             
            {
         | 
| 35 23 | 
             
                "__spy_point__": "HeatWatcher#sleep",
         | 
| 36 24 | 
             
                "seconds": 60
         | 
| 37 25 | 
             
            },
         | 
| 38 | 
            -
            {
         | 
| 39 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 40 | 
            -
            },
         | 
| 41 26 | 
             
            {
         | 
| 42 27 | 
             
                "__spy_point__": "HeatWatcher#make_request",
         | 
| 43 28 | 
             
                "url": "http://system.server.com/temperature"
         | 
| 44 29 | 
             
            },
         | 
| 45 30 | 
             
            {
         | 
| 46 31 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 47 | 
            -
                "result": 73 | 
| 48 | 
            -
            },
         | 
| 49 | 
            -
            {
         | 
| 50 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 32 | 
            +
                "result": 73
         | 
| 51 33 | 
             
            },
         | 
| 52 34 | 
             
            {
         | 
| 53 35 | 
             
                "__spy_point__": "HeatWatcher#send_alert",
         | 
| @@ -62,55 +44,37 @@ | |
| 62 44 | 
             
                "__spy_point__": "HeatWatcher#sleep",
         | 
| 63 45 | 
             
                "seconds": 10
         | 
| 64 46 | 
             
            },
         | 
| 65 | 
            -
            {
         | 
| 66 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 67 | 
            -
            },
         | 
| 68 47 | 
             
            {
         | 
| 69 48 | 
             
                "__spy_point__": "HeatWatcher#make_request",
         | 
| 70 49 | 
             
                "url": "http://system.server.com/temperature"
         | 
| 71 50 | 
             
            },
         | 
| 72 51 | 
             
            {
         | 
| 73 52 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 74 | 
            -
                "result": 73. | 
| 75 | 
            -
            },
         | 
| 76 | 
            -
            {
         | 
| 77 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 53 | 
            +
                "result": 73.5000
         | 
| 78 54 | 
             
            },
         | 
| 79 55 | 
             
            {
         | 
| 80 56 | 
             
                "__spy_point__": "HeatWatcher#sleep",
         | 
| 81 57 | 
             
                "seconds": 10
         | 
| 82 58 | 
             
            },
         | 
| 83 | 
            -
            {
         | 
| 84 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 85 | 
            -
            },
         | 
| 86 59 | 
             
            {
         | 
| 87 60 | 
             
                "__spy_point__": "HeatWatcher#make_request",
         | 
| 88 61 | 
             
                "url": "http://system.server.com/temperature"
         | 
| 89 62 | 
             
            },
         | 
| 90 63 | 
             
            {
         | 
| 91 64 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 92 | 
            -
                "result": 74 | 
| 93 | 
            -
            },
         | 
| 94 | 
            -
            {
         | 
| 95 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 65 | 
            +
                "result": 74
         | 
| 96 66 | 
             
            },
         | 
| 97 67 | 
             
            {
         | 
| 98 68 | 
             
                "__spy_point__": "HeatWatcher#sleep",
         | 
| 99 69 | 
             
                "seconds": 10
         | 
| 100 70 | 
             
            },
         | 
| 101 | 
            -
            {
         | 
| 102 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 103 | 
            -
            },
         | 
| 104 71 | 
             
            {
         | 
| 105 72 | 
             
                "__spy_point__": "HeatWatcher#make_request",
         | 
| 106 73 | 
             
                "url": "http://system.server.com/temperature"
         | 
| 107 74 | 
             
            },
         | 
| 108 75 | 
             
            {
         | 
| 109 76 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 110 | 
            -
                "result": 74. | 
| 111 | 
            -
            },
         | 
| 112 | 
            -
            {
         | 
| 113 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 77 | 
            +
                "result": 74.0833
         | 
| 114 78 | 
             
            },
         | 
| 115 79 | 
             
            {
         | 
| 116 80 | 
             
                "__spy_point__": "HeatWatcher#send_alert",
         | 
| @@ -125,18 +89,12 @@ | |
| 125 89 | 
             
                "__spy_point__": "HeatWatcher#sleep",
         | 
| 126 90 | 
             
                "seconds": 60
         | 
| 127 91 | 
             
            },
         | 
| 128 | 
            -
            {
         | 
| 129 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 130 | 
            -
            },
         | 
| 131 92 | 
             
            {
         | 
| 132 93 | 
             
                "__spy_point__": "HeatWatcher#make_request",
         | 
| 133 94 | 
             
                "url": "http://system.server.com/temperature"
         | 
| 134 95 | 
             
            },
         | 
| 135 96 | 
             
            {
         | 
| 136 97 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 137 | 
            -
                "result": 74. | 
| 138 | 
            -
            },
         | 
| 139 | 
            -
            {
         | 
| 140 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 98 | 
            +
                "result": 74.5833
         | 
| 141 99 | 
             
            }
         | 
| 142 100 | 
             
            ]
         | 
| @@ -1,41 +1,23 @@ | |
| 1 1 | 
             
            [
         | 
| 2 | 
            -
            {
         | 
| 3 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 4 | 
            -
            },
         | 
| 5 2 | 
             
            {
         | 
| 6 3 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 7 | 
            -
                "result": 70 | 
| 8 | 
            -
            },
         | 
| 9 | 
            -
            {
         | 
| 10 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 4 | 
            +
                "result": 70
         | 
| 11 5 | 
             
            },
         | 
| 12 6 | 
             
            {
         | 
| 13 7 | 
             
                "__spy_point__": "HeatWatcher#sleep",
         | 
| 14 8 | 
             
                "seconds": 60
         | 
| 15 9 | 
             
            },
         | 
| 16 | 
            -
            {
         | 
| 17 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 18 | 
            -
            },
         | 
| 19 10 | 
             
            {
         | 
| 20 11 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 21 | 
            -
                "result": 70. | 
| 22 | 
            -
            },
         | 
| 23 | 
            -
            {
         | 
| 24 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 12 | 
            +
                "result": 70.5000
         | 
| 25 13 | 
             
            },
         | 
| 26 14 | 
             
            {
         | 
| 27 15 | 
             
                "__spy_point__": "HeatWatcher#sleep",
         | 
| 28 16 | 
             
                "seconds": 60
         | 
| 29 17 | 
             
            },
         | 
| 30 | 
            -
            {
         | 
| 31 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 32 | 
            -
            },
         | 
| 33 18 | 
             
            {
         | 
| 34 19 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 35 | 
            -
                "result": 71. | 
| 36 | 
            -
            },
         | 
| 37 | 
            -
            {
         | 
| 38 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 20 | 
            +
                "result": 71.6000
         | 
| 39 21 | 
             
            },
         | 
| 40 22 | 
             
            {
         | 
| 41 23 | 
             
                "__spy_point__": "HeatWatcher#send_alert",
         | 
| @@ -45,15 +27,9 @@ | |
| 45 27 | 
             
                "__spy_point__": "HeatWatcher#sleep",
         | 
| 46 28 | 
             
                "seconds": 10
         | 
| 47 29 | 
             
            },
         | 
| 48 | 
            -
            {
         | 
| 49 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 50 | 
            -
            },
         | 
| 51 30 | 
             
            {
         | 
| 52 31 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 53 | 
            -
                "result": 71. | 
| 54 | 
            -
            },
         | 
| 55 | 
            -
            {
         | 
| 56 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 32 | 
            +
                "result": 71.6167
         | 
| 57 33 | 
             
            },
         | 
| 58 34 | 
             
            {
         | 
| 59 35 | 
             
                "__spy_point__": "HeatWatcher#send_alert",
         | 
| @@ -63,70 +39,40 @@ | |
| 63 39 | 
             
                "__spy_point__": "HeatWatcher#sleep",
         | 
| 64 40 | 
             
                "seconds": 60
         | 
| 65 41 | 
             
            },
         | 
| 66 | 
            -
            {
         | 
| 67 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 68 | 
            -
            },
         | 
| 69 42 | 
             
            {
         | 
| 70 43 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 71 | 
            -
                "result": 71. | 
| 72 | 
            -
            },
         | 
| 73 | 
            -
            {
         | 
| 74 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 44 | 
            +
                "result": 71.7167
         | 
| 75 45 | 
             
            },
         | 
| 76 46 | 
             
            {
         | 
| 77 47 | 
             
                "__spy_point__": "HeatWatcher#sleep",
         | 
| 78 48 | 
             
                "seconds": 60
         | 
| 79 49 | 
             
            },
         | 
| 80 | 
            -
            {
         | 
| 81 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 82 | 
            -
            },
         | 
| 83 50 | 
             
            {
         | 
| 84 51 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 85 | 
            -
                "result": 71. | 
| 86 | 
            -
            },
         | 
| 87 | 
            -
            {
         | 
| 88 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 52 | 
            +
                "result": 71.8167
         | 
| 89 53 | 
             
            },
         | 
| 90 54 | 
             
            {
         | 
| 91 55 | 
             
                "__spy_point__": "HeatWatcher#sleep",
         | 
| 92 56 | 
             
                "seconds": 60
         | 
| 93 57 | 
             
            },
         | 
| 94 | 
            -
            {
         | 
| 95 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 96 | 
            -
            },
         | 
| 97 58 | 
             
            {
         | 
| 98 59 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 99 | 
            -
                "result": 71. | 
| 100 | 
            -
            },
         | 
| 101 | 
            -
            {
         | 
| 102 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 60 | 
            +
                "result": 71.9167
         | 
| 103 61 | 
             
            },
         | 
| 104 62 | 
             
            {
         | 
| 105 63 | 
             
                "__spy_point__": "HeatWatcher#sleep",
         | 
| 106 64 | 
             
                "seconds": 60
         | 
| 107 65 | 
             
            },
         | 
| 108 | 
            -
            {
         | 
| 109 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 110 | 
            -
            },
         | 
| 111 66 | 
             
            {
         | 
| 112 67 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 113 | 
            -
                "result": 72. | 
| 114 | 
            -
            },
         | 
| 115 | 
            -
            {
         | 
| 116 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 68 | 
            +
                "result": 72.0167
         | 
| 117 69 | 
             
            },
         | 
| 118 70 | 
             
            {
         | 
| 119 71 | 
             
                "__spy_point__": "HeatWatcher#sleep",
         | 
| 120 72 | 
             
                "seconds": 60
         | 
| 121 73 | 
             
            },
         | 
| 122 | 
            -
            {
         | 
| 123 | 
            -
                "__spy_point__": "HeatWatcher#get_temperature"
         | 
| 124 | 
            -
            },
         | 
| 125 74 | 
             
            {
         | 
| 126 75 | 
             
                "__spy_point__": "HeatWatcher#get_temperature.result",
         | 
| 127 | 
            -
                "result": 72. | 
| 128 | 
            -
            },
         | 
| 129 | 
            -
            {
         | 
| 130 | 
            -
                "__spy_point__": "HeatWatcher#get_current_time"
         | 
| 76 | 
            +
                "result": 72.1167
         | 
| 131 77 | 
             
            }
         | 
| 132 78 | 
             
            ]
         |