Giter VIP home page Giter VIP logo

birdseye's Introduction

logo birdseye

Build Status Supports Python versions 2.7 and 3.5+

birdseye is a Python debugger which records the values of expressions in a function call and lets you easily view them after the function exits. For example:

You can use birdseye no matter how you run or edit your code. Just pip install birdseye, add the @eye decorator as seen above, run your function however you like, and view the results in your browser. It's also integrated with some common tools for a smoother experience.

You can try it out instantly on futurecoder: enter your code in the editor on the left and click the birdseye button to run. No imports or decorators required.

Feature Highlights

Rather than stepping through lines, move back and forth through loop iterations and see how the values of selected expressions change:

See which expressions raise exceptions, even if they’re suppressed:

Expand concrete data structures and objects to see their contents. Lengths and depths are limited to avoid an overload of data.

Calls are organised into functions (which are organised into files) and ordered by time, letting you see what happens at a glance:

Read more documentation here

birdseye's People

Contributors

aivarannamaa avatar alexmojaki avatar bugosiphionah avatar houluy avatar michaelcurrin avatar skeledrew avatar spamegg1 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

birdseye's Issues

Awkward indentation in multiline expressions

Because the browser has to render each expression as a rectangle, some of the whitespace used for indentation in a multiline expression becomes 'redundant' and the result looks weird:

screen shot 2017-10-27 at 17 09 46

This is how it should look:

def foo():
    print('hello',
          'world')

sqlalchemy dependency should be pinned to < 1.4

First of all, thank you for the useful library! Let's get to business:

Using python 3.8.5, when installing birdseye==0.8.4, all succeeds. Given the following test class:

class Foo(object):
    @eye
    def bar(self, baz):
        x = range(5)
        print(baz)

if __name__ == '__main__':
    Foo().bar(123)

When running this, because the sqlalchemy dependency is not pinned to be below <1.4, an exception is thrown spawning from db.py:194 with:

'Engine' object has no attribute 'exec_driver_sql'

When debugging the problem, I did:

In [1]: import sqlalchemy

In [2]: sqlalchemy.__version__
Out[2]: '1.4.2'

I know SQLAlchemy just released a big update with v1.4.0, so I tried:

❯❯❯ pyenv exec pip install 'sqlalchemy<1.4'
Collecting sqlalchemy<1.4
  Downloading SQLAlchemy-1.3.23-cp38-cp38-macosx_10_14_x86_64.whl (1.2 MB)
     |████████████████████████████████| 1.2 MB 4.9 MB/s
Installing collected packages: sqlalchemy
  Attempting uninstall: sqlalchemy
    Found existing installation: SQLAlchemy 1.4.2
    Uninstalling SQLAlchemy-1.4.2:
      Successfully uninstalled SQLAlchemy-1.4.2
Successfully installed sqlalchemy-1.3.23

and that fixed the problem.

IndexError: list index out of range

After running python -m birdseye.clear_db and executing the program again, I'm now getting this exception when I click on a function from the front page.

Traceback (most recent call last):
  File "/home/user/.envs/dotfiles-_bp8OBTv/lib/python3.6/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/user/.envs/dotfiles-_bp8OBTv/lib/python3.6/site-packages/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/home/user/.envs/dotfiles-_bp8OBTv/lib/python3.6/site-packages/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/user/.envs/dotfiles-_bp8OBTv/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/home/user/.envs/dotfiles-_bp8OBTv/lib/python3.6/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/user/.envs/dotfiles-_bp8OBTv/lib/python3.6/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/user/.envs/dotfiles-_bp8OBTv/lib/python3.6/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/user/.envs/dotfiles-_bp8OBTv/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/home/user/.envs/dotfiles-_bp8OBTv/lib/python3.6/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/user/.envs/dotfiles-_bp8OBTv/lib/python3.6/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/user/.envs/dotfiles-_bp8OBTv/lib/python3.6/site-packages/littleutils/__init__.py", line 227, in wrapper
    return func(*args, **kwargs)
  File "/home/user/.envs/dotfiles-_bp8OBTv/lib/python3.6/site-packages/birdseye/db.py", line 229, in wrapper
    return func(session, *args, **kwargs)
  File "/home/user/.envs/dotfiles-_bp8OBTv/lib/python3.6/site-packages/birdseye/server.py", line 132, in func_view
    func = session.query(Function).filter_by(file=path, name=func_name)[0]
  File "/home/user/.envs/dotfiles-_bp8OBTv/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2692, in __getitem__
    return list(self[item:item + 1])[0]
IndexError: list index out of range

birdseye 0.8.1
python 3.6.5
ubuntu 18.04

Logo

Current attempt:

snake-birdseye

I'm not a graphic designer, so I'm hoping that someone more skilled can make this look better. For now, I'm thinking about the general concept.

@Almenon, what are your first impressions of this?

Allow removing expressions directly in the value inspector

Clicking on an expression in code adds it to the value inspector. Clicking again (in the same place) removes it. Clicking in the inspector highlights the expression in as if selecting it, but this does nothing. Either it should be possible to remove the 'selected' expression by pressing delete/backspace, or there should be an ✖️ button for removal.

Using birdseye in interactive session

I want to be able to decorate functions in an interactive session.

When I try to evaluate such function, it will throw the exception:

FileNotFoundError: [Errno 2] No such file or directory: '<ipython-input-7-01fc7a9cd10c>'

Initially I thought: go for an easy/hacky fix whenever the filename starts with "<", then replace it with something like "interactive-session".

But I see you depend on it for the source code from filename. You could try inspect.getsource(obj) instead.

Tracing within an exec'd string does not work

I am attempting to use birdseye from within another tool, and a part of what it does is modify the source dynamically. This causes attempts to get a filename to fail. Is there a way to get around this without, say creating a temporary file?

...
  File "/home/skeledrew/Projects/pyls-livepy/.nox/make_pyls_livepy_test_env/lib/python3.7/site-packages/pyls_livepy/tracer.py", line 108, in trace_and_report
    report = run_trace_2(modded_source)
             │           └ 'import pyls_livepy\n\n@pyls_livepy.eye\ndef func(x):\n    """\n    >>> func(5)\n    0\n    """\n    return x * x\n\nfunc(5)\n'
             └ <function run_trace_2 at 0x7fe36615d830>
> File "/home/skeledrew/Projects/pyls-livepy/.nox/make_pyls_livepy_test_env/lib/python3.7/site-packages/pyls_livepy/tracer.py", line 78, in run_trace_2
    exec(source)
         └ 'import pyls_livepy\n\n@pyls_livepy.eye\ndef func(x):\n    """\n    >>> func(5)\n    0\n    """\n    return x * x\n\nfunc(5)\n'
  File "<string>", line 3, in <module>
  File "/home/skeledrew/Projects/pyls-livepy/.nox/make_pyls_livepy_test_env/lib/python3.7/site-packages/birdseye/__init__.py", line 24, in __call__
    return self.__val()(*args, **kwargs)
           │             │       └ {}
           │             └ (<function func at 0x7fe369310e60>,)
           └ <birdseye._SimpleProxy object at 0x7fe368e31750>
  File "/home/skeledrew/Projects/pyls-livepy/.nox/make_pyls_livepy_test_env/lib/python3.7/site-packages/birdseye/tracer.py", line 273, in __call__
    return self.trace_function(func)
           │    │              └ <function func at 0x7fe369310e60>
           │    └ <function BirdsEye.trace_function at 0x7fe3671f07a0>
           └ <birdseye.bird.BirdsEye object at 0x7fe3671ef110>
  File "/home/skeledrew/Projects/pyls-livepy/.nox/make_pyls_livepy_test_env/lib/python3.7/site-packages/birdseye/bird.py", line 410, in trace_function
    new_func = super(BirdsEye, self).trace_function(func)
                     │         │                    └ <function func at 0x7fe369310e60>
                     │         └ <birdseye.bird.BirdsEye object at 0x7fe3671ef110>
                     └ <class 'birdseye.bird.BirdsEye'>
  File "/home/skeledrew/Projects/pyls-livepy/.nox/make_pyls_livepy_test_env/lib/python3.7/site-packages/birdseye/tracer.py", line 204, in trace_function
    source = read_source_file(filename)
             │                └ '<string>'
             └ <function read_source_file at 0x7fe36841d8c0>
  File "/home/skeledrew/Projects/pyls-livepy/.nox/make_pyls_livepy_test_env/lib/python3.7/site-packages/birdseye/utils.py", line 202, in read_source_file
    with open_with_encoding_check(filename) as f:
         │                        └ '<string>'
         └ <function open at 0x7fe369e3c4d0>
  File "/home/skeledrew/.conda/envs/utils_env/lib/python3.7/tokenize.py", line 447, in open
    buffer = _builtin_open(filename, 'rb')
             │             └ '<string>'
             └ <built-in function open>

FileNotFoundError: [Errno 2] No such file or directory: '<string>'

PyCharm integration

This would involve creating a plugin for PyCharm which visually annotates a source code file when appropriate, so you can view the debugging information without leaving your editor. Beyond that, it might mean integrating with the debugger to view values while the debugger is paused.

Hide slices in 3.9

As mentioned in #87 this now happens in 3.9:

Screenshot from 2021-02-22 11-30-55

This is just visual clutter that should be removed

Raise exception if @eye is applied after other decorators

For example, this should fail:

@eye
@decorator
def foo(): pass

It's not possible to catch every conceivable misuse of the decorator, such as foo = eye(foo), but this should still be helpful.

If possible, this check should be in TreeTracerBase.

example_usage.py won't run. No module named future

I tried this on my Mac OSX-10.12.6 Sierra

$pip install birdseye
Requirement already satisfied: birdseye in /usr/local/lib/python2.7/site-packages
Requirement already satisfied: asttokens in /usr/local/lib/python2.7/site-packages (from birdseye)
Requirement already satisfied: backports.functools-lru-cache in /usr/local/lib/python2.7/site-packages (from birdseye)
Requirement already satisfied: Flask in /usr/local/lib/python2.7/site-packages (from birdseye)
Requirement already satisfied: sqlalchemy in /usr/local/lib/python2.7/site-packages (from birdseye)
Requirement already satisfied: littleutils in /usr/local/lib/python2.7/site-packages (from birdseye)
Requirement already satisfied: future in /usr/local/lib/python2.7/site-packages (from birdseye)
Requirement already satisfied: typing in /usr/local/lib/python2.7/site-packages (from birdseye)
Requirement already satisfied: cheap-repr in /usr/local/lib/python2.7/site-packages (from birdseye)
Requirement already satisfied: flask-humanize in /usr/local/lib/python2.7/site-packages (from birdseye)
Requirement already satisfied: six in /usr/local/lib/python2.7/site-packages (from asttokens->birdseye)
Requirement already satisfied: Werkzeug>=0.7 in /usr/local/lib/python2.7/site-packages (from Flask->birdseye)
Requirement already satisfied: Jinja2>=2.4 in /usr/local/lib/python2.7/site-packages (from Flask->birdseye)
Requirement already satisfied: click>=2.0 in /usr/local/lib/python2.7/site-packages (from Flask->birdseye)
Requirement already satisfied: itsdangerous>=0.21 in /usr/local/lib/python2.7/site-packages (from Flask->birdseye)
Requirement already satisfied: qualname in /usr/local/lib/python2.7/site-packages (from cheap-repr->birdseye)
Requirement already satisfied: humanize>=0.5.1 in /usr/local/lib/python2.7/site-packages (from flask-humanize->birdseye)
Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python2.7/site-packages (from Jinja2>=2.4->Flask->birdseye)

$python example_usage.py
Traceback (most recent call last):
  File "example_usage.py", line 4, in <module>
    from birdseye import eye
  File "/Users/frak/git/birdseye/birdseye/birdseye/__init__.py", line 3, in <module>
    from future import standard_library
ImportError: No module named future

$pip install future
Requirement already satisfied: future in /usr/local/lib/python2.7/site-packages

$which python
/usr/bin/python

$python --version
Python 2.7.10

Show tracebacks for exceptions caught in call

When an exception is raised and caught inside a call, the place where the exception happens is highlighted and the message can be seen, but only the message. If the exception originates deeper down, it may be useful to see the traceback from the current call down to the origin. Exactly how to display it is not clear.

http://localhost:7777/ipython_call rejected conection

im extra virgin in programming haha and using on thonny, the thing is, the program open a browser windows and then, dont show how is supposed to, i even make:
0. my private ip dmz, turn down smartscreen (windows)
1 .antivirus defender on all his options
2. make exclusions for firewall, deactivated the firewall, changed the port to various numbers
3. open manually the ports on router, i mean, how unsecure my notebook is supposed to be?!
hahaha

image

packages in thonny:
0. image
1.
image

the bottom of this, is that im trying to understand this code:

def tri_recursion(k):
  if(k>0):
    result = k+tri_recursion(k-2)
    print(result)
  else:
    result = 0
  return result

print("\n\nRecursion Example Results")
tri_recursion(6)

any help will be greatly appreciated,
even links with google searches, I'm so lost haha

command line argument for changing color scheme

VSCode has two categories of color schemes - light and dark. It would be great if I could pass in a command line argument for the color scheme so birdseye looks better in contrast with vscode (see #54)

want birdseye to be included in a pycon poster?

I'll be going to Pycon in early May to do a poster presentation for AREPL ~ would you like to have birdseye be included in that poster? It falls under the same category of visual debuggers, and I wouldn't mind giving some space on the poster to promote it. Thousands of people attend Pycon each year and it would be a great marketing opportunity for birdseye.

The poster is 36" by 48" - I could give you 9" by 11". You can send me a mockup or pic or whatever for what you want it to look like. The catch is that I'm planning on printing the poster by May 1, so that would not give you a lot of time :/ Sorry about the late notice.

I tried e-mailing you but I'm not sure if it went through spam filter.

No module named 'birdseye', windows 10, jupyter lab

Trying to use birdseye with %load_ext birdseye in jupyter lab, win 10. Getting error ModuleNotFoundError: No module named 'birdseye' On another machine with win 7 - everything's perfectly fine.

Tried different approaches - with conda, virtualenv, different python versions, etc. No result.

Create performance benchmarks

This would make it easier to measure the effects of any attempted optimisations. Both the volume of data and time taken need measuring, as tradeoffs between them may be made.

Compatability with python 3.8

Hi,
Love this tool. I keep telling everyone about it.
Python 3.8 compatibility would be awesome!

Edit:
I forked it, changed nothing besides adding the 'Programming Language :: Python :: 3.8' classifier inside setup.py, pip installed it locally and it works with 3.8 as is (which makes sense).

I felt silly creating a PR for adding a single line.

Cannot trace a module and use @eye at the same time

In code like this:

import birdseye.trace_module
from birdseye import eye

@eye
def foo():

The trace_module puts hidden functions like _treetrace_hidden_before_expr in the globals, which implicitly refer to a TracedFile for everything after the import.

The call to @eye replaces the hidden globals with new slightly different globals with a TracedFile for the entire file.

Basically _trace_methods_dict and the code modification needs to use randomly generated global function names instead of static ones which conflict.

Feature request: recursively trace calls within traced function

Hi, thanks for birdseye!

I often use it to trace a whole flow, e.g a web request, from endpoint to response.
It's especially useful when the flow is complicated and can't be debugged locally.

It can get cumbersome to @eye the first function -> run it -> add an @eye -> run it again -> add the next @eye -> etc.

It would be great if one could e.g

def bar(): ...

def baz(): ...

@deep_eye
def foo(call_bar: bool):
    if call_bar:
        return bar()
    return baz()

Which would be equivalent to simply decorating foo, bar and baz with @eye.

To avoid exploding, maybe a @deep_eye(trace_limit=10) option could be supported.

I know birdseye can trace whole modules, but more often than not, functions call functions from other modules, so I'm imagining a trace of a call tree that spans different modules.

What are your thoughts?

Thanks,
Gilad

"too many statically nested blocks" error in long elif chain

MCVE:

from birdseye import eye

@eye
def foo():
    if 0:
        pass
    elif 0:
        pass
    elif 1:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass
    elif 0:
        pass

The reason this happens is that:

elif clauses don’t have a special representation in the AST, but rather appear as extra If nodes within the orelse section of the previous one.

which leads to many hidden nested with blocks created when transforming the AST to trace statements.

It should be possible to fix this by only wrapping the body of each elif/else block in a with statement.

feature_request(IDE): Sublime Text integration

1. Summary

It would be nice, if will be realized integration birdseye for Sublime Text 3. Plugins for Sublime Text are written in Python.

2. Argumentation

  1. Sublime Text — second most common Python IDE (after PyCharm) by Python Software Foundation Statistics.
  2. See features of Sublime Text for Python. There is everything except the debugger.

3. Already existing Sublime Text debuggers

  1. Plugin Debugger — bugs, not developed from 2014.
  2. SublimeDebuggerbugs, poor documentation.

Thanks.

Show nice stack trace in call view

  • Remove the traceback database field from Call. We're going to start storing more complex data than text now, so use the data field instead.
  • Format the traceback in a similar way to Flask/werkzeug: in particular being able to click on a line to view context around it, and click again to collapse.
  • Include the traceback for all calls, but for calls that didn't end with an exception, the traceback should be completely collapsed/hidden to begin with, so the user can optionally view it but it's usually out of the way.
  • For calls with exceptions, highlight the stack frame in the traceback that corresponds to the call being viewed.

In a future PR we can add local variables and links to other traced calls.

Allow searching for values in inspector

jstree (the library used to show expanding values in the inspector) has a search plugin which could be cool to integrate. Searching for a string would show which children of which expressions contain that string. Handy when you think that a string is somewhere deep inside the nested attributes/values of an object but don't want to click around searching for it.

Birdseye uses frozen time instead of actual time

I'm not sure this is fixable, but when freezegun's freeze_time is used to decorate a unit test in which the current time is a variable, birdseye decorated function calls appear under that date in the web interface instead of the current date and time.

PS: this is a great tool, thanks :)

Allow decorating a class to indicate decorating all methods defined within

The goal is that this:

from birdseye import eye


def baz(self):
    print(3)


@eye
class A(object):
    b = baz

    def foo(self):
        pass

    def bar(self):
        pass

becomes equivalent to:

@eye
def baz(self):
    print(3)


class A(object):
    b = baz

    @eye
    def foo(self):
        pass

    @eye
    def bar(self):
        pass

Some handy code as a starting point:

[x for x in A.__dict__.values() if inspect.ismethod(x) or inspect.isfunction(x)]

VSCode extension

Let me start off by saying great work! Your display is what I wish I had over in AREPL, but I just return the final variables and call it a day :P

If I have time I might be able to work on a VSCode extension for birdseye, are you interested?

It looks pretty simple to implement, it would just require checking if the user has birdseye, spawning a process

python -m birdseye

Then opening localhost:7777 in a preview pane.

I already have a preview pane boilerplate to extend from so that part's pretty much done.

Or theoretically that's how it would work, anyways. I wouldn't be suprised if there was problems along the way.

NodeValue.expression fails on DataFrame objects

for i, (formatted_name, label) in enumerate(zip(val.columns.format(),
                                                            val.columns)):

produces an error if used with DataFrames:


[...]bird.py", line 1045, in expression
    for i, (formatted_name, label) in enumerate(zip(val.columns.format(sparsify=False),
TypeError: format() got an unexpected keyword argument 'sparsify'

(birdeye=0.9.0, pandas: 1.2.4)

Schema out of date

I was about to start on Almenon/birdseye-vscode#23 and I ran into this issue:

Traceback (most recent call last):
  File "C:\Program Files\Python36\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\Program Files\Python36\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\almenon\AppData\Roaming\Python\Python36\site-packages\birdseye\__main__.py", line 5, in <module>
    from birdseye.server import main
  File "C:\Users\almenon\AppData\Roaming\Python\Python36\site-packages\birdseye\server.py", line 37, in <module>
    db = Database()
  File "C:\Users\almenon\AppData\Roaming\Python\Python36\site-packages\birdseye\db.py", line 172, in __init__
    raise ValueError('The birdseye database schema is out of date. '
ValueError: The birdseye database schema is out of date. Run "python -m birdseye.clear_db" to delete the existing tables

The message makes it clear what needs to be done to resolve the issue but what I'm wondering is why make the user run that theirself? Seems simpler to just run it automatically and show the user a info message that the tables were cleared.

Include license file in PyPI package

It would be great if a copy of the LICENSE file could be included in the PyPI package. Not only is this a good idea in general, it would assist people in packaging this software for Linux distributions.

Memoize strings in call data to reduce data volume

There's a lot of redundancy in call data, especially when the same value appears over and over. There should be a 'cache' in the data which is a list of strings, and the node_values data structure should contain no strings but only integers pointing to items in the cache.

Link to most recent call

The workflow for debugging a function is currently somewhat tedious and not necessarily intuitive for new users. You look at a call, make some changes, rerun the code, and then you have to click on the function name followed by the first line of the call table. Instead of these last two steps, there should be a link somewhere at the top which always directs to the most recent call of the function.

If the link directs back to the current call, there should be a message indicating this.

Note that a function in this case is identified by the name and file, which may correspond to several rows of the function table in the database.

Jupyter/IPython notebook plugin/integration

The idea is to mark a notebook cell for tracing by birdseye (perhaps with some magic %birdseye or %eye) and then when you run the cell it creates a new cell below with the code traced as in normal birdseye, i.e. expressions and statements boxed and hoverable.

This would probably mean some refactoring in this package followed by creating a new package to contain the plugin. I'm not sure of the details at the moment as I've never created a notebook plugin and have very little experience with notebooks in general.

small string containing html script breaks debugger output

I was doing some testing of a flask function and had a couple of issues - narrowed it down to running the following simple script causes the debugger output not work correctly (tested in Chrome and Safari)

from birdseye import eye

@eye
def test():
    rc = """<script src="/vendor/jquery-3.2.0.min.js"></script>"""
    return rc

test()

The webpage shows some JSON at the top (looks like - '",10,{"len":51}],"7":["",-2,{}]},"loop_iteratio.......)

Page Console shows:
[Error] SyntaxError: Unexpected EOF
(anonymous function) (1cb61614897a4258a8cdf3fa3cce4a2e:14)
[Warning] jQuery.Deferred exception: Can't find variable: call_data (2) (jquery-3.2.1.js, line 3860)
(anonymous function) — call.js:20
mightThrow — jquery-3.2.1.js:3583
(anonymous function) — jquery-3.2.1.js:3651
undefined
[Error] Failed to load resource: the server responded with a status of 404 (NOT FOUND) (bootstrap.min.css.map, line 0)
[Error] ReferenceError: Can't find variable: call_data
(anonymous function) (jquery-3.2.1.js:3869)

Async function tracing

As I see in the code of this debugger, the async functions were deliberately forbidden for tracing.
What's the reason for it?
And can we expect to see this implemented in the future? I mean the tracing of async functions.
Thank you.

Add clear database button

Add a button on the main page which drops all the tables as in clear_db.py. Ask for confirmation in a dialog first.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.