Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[New] saveframe utility #356

Merged
merged 4 commits into from
Oct 17, 2024
Merged

Conversation

saharan-deshaw
Copy link
Collaborator

@saharan-deshaw saharan-deshaw commented Sep 10, 2024

This commit adds a new utility named 'saveframe' in pyflyby.

This utility can be used to save information for debugging / reproducing an issue.

Usage:
If you have a piece of code that is currently failing due to an issue originating from upstream code, and you cannot share your private code as a reproducer, use this utility to save relevant information to a file. Share the generated file with the upstream team, enabling them to reproduce and diagnose the issue independently.

This utility is provided with 2 interfaces: a script and a function.

Script location: pyflyby/bin/saveframe
Function location: pyflyby.saveframe (from pyflyby import saveframe)

For more information on the savefrane script, checkout the help message using pyflyby/bin/saveframe --help

For more information on the saveframe function, checkout the doc of pyflyby.saveframe.

This commit adds a new utility named 'saveframe' in pyflyby.

This utility can be used to save information for debugging / reproducing
an issue.

Usage:
If you have a piece of code that is currently failing due to an issue originating
from another team's code, and you cannot share your private code as a reproducer,
use this utility to save relevant information to a file. Share the generated file
with the other team, enabling them to reproduce and diagnose the issue
independently.

This utility is provided with 2 interfaces: a script and a function.

Script location: `pyflyby/bin/saveframe`
Function location: `pyflyby.saveframe` (`from pyflyby import saveframe`)

For more information on the `savefrane` script, checkout the help message
using `pyflyby/bin/saveframe --help`

For more information on the `saveframe` function, checkout the doc of
`pyflyby.saveframe`.
@saharan-deshaw
Copy link
Collaborator Author

saharan-deshaw commented Sep 10, 2024

cc @sac111gp

FYI this PR is for #355

lib/python/pyflyby/_saveframe.py Outdated Show resolved Hide resolved
lib/python/pyflyby/_saveframe.py Outdated Show resolved Hide resolved
lib/python/pyflyby/_saveframe.py Outdated Show resolved Hide resolved
lib/python/pyflyby/_saveframe.py Show resolved Hide resolved
lib/python/pyflyby/_saveframe.py Show resolved Hide resolved
lib/python/pyflyby/_saveframe.py Show resolved Hide resolved
lib/python/pyflyby/_saveframe.py Show resolved Hide resolved
lib/python/pyflyby/_saveframe.py Outdated Show resolved Hide resolved
lib/python/pyflyby/_saveframe.py Outdated Show resolved Hide resolved
lib/python/pyflyby/_saveframe.py Outdated Show resolved Hide resolved
lib/python/pyflyby/_saveframe.py Outdated Show resolved Hide resolved
tests/test_saveframe.py Outdated Show resolved Hide resolved
- Removed f-strings from logger's info and warning
- Use sys.last_exc for python 3.12+
- Added some examples in the doc of saveframe function and the script
@saharan-deshaw saharan-deshaw merged commit 6eae532 into deshaw:master Oct 17, 2024
8 checks passed
saharan-deshaw added a commit that referenced this pull request Oct 18, 2024
Updated README to include info about the newly added saveframe 
utility (#356)
saharan-deshaw pushed a commit to saharan-deshaw/pyflyby that referenced this pull request Dec 10, 2024
**Background:**
In deshaw#356, we added a new utility named `saveframe` in Pyflyby, that can
be used to save information for debugging / reproducing an issue.

**Issue:**
The `saveframe` utility saves data as a pickled Python dictionary.
Reading this raw data and extracting values of specific variables or metadata
fields can be complex.

This commit adds a new class named `SaveframeReader`, for reading data saved by
the `saveframe` utility.

The `SaveframeReader` class provides an easy and efficient way to read the
raw data and extract specific items. This class has a user-friendly `repr`
for visualizing the data and provides various helpful methods to extract
different items.

**Usage Example:**

**Creating an instance**

First, create an instance of this class by passing the path of the file that
contains the `saveframe` data.
```
>>> from pyflyby import SaveframeReader
>>> reader = SaveframeReader('/path/to/file')
```

**Extracting all available metadata fields**

To extract all available metadata fields, use the `SaveframeReader.metadata`
property. Example:
```
>>> reader.metadata
['frame_index', 'filename', 'lineno', 'function_name', 'function_qualname',
'function_object', 'module_name', 'code', 'frame_identifier',
'exception_string', 'exception_full_string', 'exception_class_name',
'exception_class_qualname', 'exception_object', 'traceback']
```

**Extracting all stored local variables**

To extract the names of all local variables stored in the frames, use the
`SaveframeReader.variables` property. Example:
```
>>> reader.variables
{
   1: ['var1', 'var2', ...],
   2: ['var5', 'var8', 'var9', ...],
   ...
}
```

**Extracting the value of a specific metadata field**

To extract the value of a specific metadata field, use the
`SaveframeReader.get_metadata` method. Example:
```
>> reader.get_metadata("filename")
{1: '/dir1/mod1.py', 2: '/dir2/mod2.py', ...}

>> reader.get_metadata("filename", frame_idx=2)
'/dir2/mod2.py'

>> reader.get_metadata("exception_string")
"Error is raised"
```

**Extracting the value of specific local variables**

To extract the value of specific local variable(s), use the
`SaveframeReader.get_variables` method. Example:
```
>> reader.get_variables('var1')
{2: var1_value2, 4: var1_value4}

>>  reader.get_variables('var1', frame_idx=4)
var1_value4

>> reader.get_variables('var2')
var2_value3

>> reader.get_variables(['var1', 'var3'])
{2: {'var1': var1_value2, 'var3': var3_value2},
4: {'var1': var1_value4}, 5: {'var3': var3_value5}}

>> reader.get_variables(['var1', 'var3'], frame_idx=2)
{'var1': var1_value2, 'var3': var3_value2}
```

**NOTE:** Raw data can be extracted using `SaveframeReader.data` property.

Request: PyInf#13916
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants