Skip to content
This repository has been archived by the owner on Apr 9, 2024. It is now read-only.

Commit

Permalink
Merge c07796c into 13daf83
Browse files Browse the repository at this point in the history
  • Loading branch information
ankostis committed Jun 8, 2018
2 parents 13daf83 + c07796c commit 831010e
Show file tree
Hide file tree
Showing 23 changed files with 92 additions and 53 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ tests:

flake8 --exclude=__init__.py,memory_profiler.py pycallgraph
flake8 --ignore=F403 test
flake8 examples
flake8 examples --exclude=all.py

doc:
cd docs/examples && ./generate.py
Expand Down
2 changes: 1 addition & 1 deletion examples/gephi/basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def main():

with PyCallGraph(output=gephi):
person = Person()
for a in xrange(10):
for a in range(10):
person.add_banana(Banana())
person.eat_bananas()

Expand Down
2 changes: 1 addition & 1 deletion examples/graphviz/basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def main():

with PyCallGraph(output=graphviz):
person = Person()
for a in xrange(10):
for a in range(10):
person.add_banana(Banana())
person.eat_bananas()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ def main():
s2 = SubmoduleTwo()
s2.report()


if __name__ == "__main__":
main()
3 changes: 2 additions & 1 deletion examples/graphviz/recursive.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ def main():
graphviz.output_file = 'recursive.png'

with PyCallGraph(output=graphviz):
for a in xrange(1, 10):
for a in range(1, 10):
factorial(a)


if __name__ == '__main__':
main()
5 changes: 3 additions & 2 deletions examples/graphviz/regexp.py
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ def main():
config = Config(include_stdlib=True)

with PyCallGraph(output=graphviz, config=config):
reo = compile()
reo = compile_regex()
match(reo)


def compile():
def compile_regex():
return re.compile('^[abetors]*$')


Expand All @@ -41,5 +41,6 @@ def words():
'abrasives',
]


if __name__ == '__main__':
main()
8 changes: 7 additions & 1 deletion pycallgraph/config.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
import argparse
import operator
import sys

from .output import outputters
from .globbing_filter import GlobbingFilter
from .grouper import Grouper


iteritems = operator.methodcaller('iteritems'
if sys.version_info < (3, ) else
'items')


class Config(object):
'''Handles configuration settings for pycallgraph, tracer, and each output
module. It also handles command line arguments.
Expand Down Expand Up @@ -38,7 +44,7 @@ def __init__(self, **kwargs):
self.did_init = True

# Update the defaults with anything from kwargs
[setattr(self, k, v) for k, v in kwargs.iteritems()]
[setattr(self, k, v) for k, v in iteritems(kwargs)]

self.create_parser()

Expand Down
11 changes: 9 additions & 2 deletions pycallgraph/output/graphviz.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from __future__ import division

import tempfile
import operator
import os
import sys
import textwrap
import subprocess as sub

Expand All @@ -11,6 +13,11 @@
from .output import Output


iteritems = operator.methodcaller('iteritems'
if sys.version_info < (3, ) else
'items')


class GraphvizOutput(Output):

def __init__(self, **kwargs):
Expand Down Expand Up @@ -151,7 +158,7 @@ def generate(self):

def attrs_from_dict(self, d):
output = []
for attr, val in d.iteritems():
for attr, val in iteritems(d):
output.append('%s = "%s"' % (attr, val))
return ', '.join(output)

Expand All @@ -167,7 +174,7 @@ def edge(self, edge, attr):

def generate_attributes(self):
output = []
for section, attrs in self.graph_attributes.iteritems():
for section, attrs in iteritems(self.graph_attributes):
output.append('{0} [ {1} ];'.format(
section, self.attrs_from_dict(attrs),
))
Expand Down
14 changes: 10 additions & 4 deletions pycallgraph/output/output.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
import re
import operator
import os
import re
import sys
from distutils.spawn import find_executable

from ..exceptions import PyCallGraphException
from ..color import Color

iteritems = operator.methodcaller('iteritems'
if sys.version_info < (3, ) else
'items')


class Output(object):
'''Base class for all outputters.'''
Expand All @@ -16,14 +22,14 @@ def __init__(self, **kwargs):
self.edge_label_func = self.edge_label

# Update the defaults with anything from kwargs
[setattr(self, k, v) for k, v in kwargs.iteritems()]
[setattr(self, k, v) for k, v in iteritems(kwargs)]

def set_config(self, config):
'''
This is a quick hack to move the config variables set in Config into
the output module config variables.
'''
for k, v in config.__dict__.iteritems():
for k, v in iteritems(config.__dict__):
if hasattr(self, k) and \
callable(getattr(self, k)):
continue
Expand Down Expand Up @@ -116,7 +122,7 @@ def debug(self, text):
self.processor.config.log_debug(text)

@classmethod
def add_output_file(cls, subparser, defaults, help):
def add_output_file(cls, subparser, defaults, help): # noqa: A002
subparser.add_argument(
'-o', '--output-file', type=str, default=defaults.output_file,
help=help,
Expand Down
2 changes: 1 addition & 1 deletion pycallgraph/pycallgraph.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def __init__(self, output=None, config=None):
def __enter__(self):
self.start()

def __exit__(self, type, value, traceback):
def __exit__(self, type, value, traceback): # noqa: A002
self.done()

def get_tracer_class(self):
Expand Down
17 changes: 12 additions & 5 deletions pycallgraph/tracer.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from __future__ import division

import inspect
import sys
import operator
import os
import sys
import time
from distutils import sysconfig
from collections import defaultdict
Expand All @@ -15,6 +16,11 @@
from .util import Util


iteritems = operator.methodcaller('iteritems'
if sys.version_info < (3, ) else
'items')


class SyncronousTracer(object):

def __init__(self, outputs, config):
Expand Down Expand Up @@ -294,7 +300,7 @@ def groups(self):
grp = defaultdict(list)
for node in self.nodes():
grp[node.group].append(node)
for g in grp.iteritems():
for g in iteritems(grp):
yield g

def stat_group_from_func(self, func, calls):
Expand All @@ -312,14 +318,14 @@ def stat_group_from_func(self, func, calls):
return stat_group

def nodes(self):
for func, calls in self.func_count.iteritems():
for func, calls in iteritems(self.func_count):
yield self.stat_group_from_func(func, calls)

def edges(self):
for src_func, dests in self.call_dict.iteritems():
for src_func, dests in iteritems(self.call_dict):
if not src_func:
continue
for dst_func, calls in dests.iteritems():
for dst_func, calls in iteritems(dests):
edge = self.stat_group_from_func(dst_func, calls)
edge.src_func = src_func
edge.dst_func = dst_func
Expand Down Expand Up @@ -372,4 +378,5 @@ def wrapper(*rest):

return wrapper


inspect.getmodule = simple_memoize(inspect.getmodule)
18 changes: 9 additions & 9 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
#!/usr/bin/env python

from os import path
from setuptools import setup
import sys

from setuptools import setup
from setuptools.command.test import test as TestCommand

import pycallgraph


# Only install the man page if the correct directory exists
# XXX: Commented because easy_install doesn't like it
#man_path = '/usr/share/man/man1/'
#if path.exists(man_path):
# data_files=[['/usr/share/man/man1/', ['man/pycallgraph.1']]]
#else:
# data_files=None
data_files = None

data_files=None

class PyTest(TestCommand):

Expand All @@ -30,6 +30,7 @@ def run_tests(self):
errno = pytest.main(self.test_args)
sys.exit(errno)


setup(
name='pycallgraph',
version=pycallgraph.__version__,
Expand All @@ -45,15 +46,15 @@ def run_tests(self):
use_2to3=True,

# TODO: Update download_url
download_url =
'http://pycallgraph.slowchop.com/files/download/pycallgraph-%s.tar.gz' % \
pycallgraph.__version__,
download_url=
'http://pycallgraph.slowchop.com/files/download/pycallgraph-%s.tar.gz' %
pycallgraph.__version__,

# Testing
tests_require=['pytest'],
cmdclass = {'test': PyTest},
cmdclass={'test': PyTest},

classifiers = [
classifiers=[
'Development Status :: 4 - Beta',
'Intended Audience :: Developers',
'License :: OSI Approved :: GNU General Public License (GPL)',
Expand All @@ -68,4 +69,3 @@ def run_tests(self):
'Topic :: Software Development :: Debuggers',
],
)

3 changes: 2 additions & 1 deletion test/conftest.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from pycallgraph import PyCallGraph, Config
import tempfile

from helpers import *
import pytest


@pytest.fixture(scope='module')
Expand Down
7 changes: 0 additions & 7 deletions test/helpers.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
# flake8: noqa
import time

import pytest

import fix_path
from pycallgraph import *
from pycallgraph.tracer import *
from pycallgraph.output import *


def wait_100ms():
time.sleep(0.1)
Expand Down
4 changes: 3 additions & 1 deletion test/test_color.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from helpers import *
from pycallgraph import ColorException, Color

import pytest


def test_bad_range():
Expand Down
2 changes: 1 addition & 1 deletion test/test_config.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from helpers import *
from pycallgraph.config import Config


def test_init():
Expand Down
9 changes: 7 additions & 2 deletions test/test_gephi.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
from helpers import *
from calls import *
from pycallgraph import PyCallGraph
from pycallgraph.output.gephi import GephiOutput
import os

import pytest

from calls import one_nop


@pytest.fixture
Expand Down
9 changes: 7 additions & 2 deletions test/test_graphviz.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
from helpers import *
from calls import *
from pycallgraph.output.graphviz import GraphvizOutput
from pycallgraph.pycallgraph import PyCallGraph
import os

import pytest

from calls import one_nop


@pytest.fixture
Expand Down
3 changes: 2 additions & 1 deletion test/test_output.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from helpers import *
from pycallgraph import Config
from pycallgraph.output import Output


def test_set_config():
Expand Down
5 changes: 4 additions & 1 deletion test/test_pycallgraph.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
from helpers import *
from pycallgraph.exceptions import PyCallGraphException
from pycallgraph.tracer import AsyncronousTracer, SyncronousTracer

import pytest


def test_start_no_outputs(pycg):
Expand Down
2 changes: 0 additions & 2 deletions test/test_script.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import subprocess

from helpers import *


def execute(arguments):
command = 'PYTHONPATH=. scripts/pycallgraph ' + arguments
Expand Down
Loading

0 comments on commit 831010e

Please sign in to comment.