summaryrefslogtreecommitdiff
path: root/dev-python/line_profiler
diff options
context:
space:
mode:
authorV3n3RiX <venerix@redcorelinux.org>2017-10-09 18:53:29 +0100
committerV3n3RiX <venerix@redcorelinux.org>2017-10-09 18:53:29 +0100
commit4f2d7949f03e1c198bc888f2d05f421d35c57e21 (patch)
treeba5f07bf3f9d22d82e54a462313f5d244036c768 /dev-python/line_profiler
reinit the tree, so we can have metadata
Diffstat (limited to 'dev-python/line_profiler')
-rw-r--r--dev-python/line_profiler/Manifest10
-rw-r--r--dev-python/line_profiler/files/line_profiler-1.0-fix-name-from-copypasta.patch25
-rw-r--r--dev-python/line_profiler/files/line_profiler-1.0-ipython-5.0-compatibility.patch299
-rw-r--r--dev-python/line_profiler/line_profiler-1.0-r1.ebuild32
-rw-r--r--dev-python/line_profiler/line_profiler-1.0.ebuild27
-rw-r--r--dev-python/line_profiler/line_profiler-2.0.ebuild28
-rw-r--r--dev-python/line_profiler/line_profiler-9999.ebuild27
-rw-r--r--dev-python/line_profiler/metadata.xml22
8 files changed, 470 insertions, 0 deletions
diff --git a/dev-python/line_profiler/Manifest b/dev-python/line_profiler/Manifest
new file mode 100644
index 000000000000..3a4ba4df717f
--- /dev/null
+++ b/dev-python/line_profiler/Manifest
@@ -0,0 +1,10 @@
+AUX line_profiler-1.0-fix-name-from-copypasta.patch 862 SHA256 58cfec02b45453c23de77a33b0639c3cdf732e01b5c8737db0bb40144789690e SHA512 6c36b574d6c031fe9c8d6dd7c59a033c5ec3dca25d675c52cea4d990e6044b5a413a347e2bd220f7912ce06e066c36839cec70af36e5153aad6c086a1d30eae6 WHIRLPOOL fe6d950dc8548f1c3c1e602f80825b02699b7eddc1525271008c582ef6876fed86317876a6c458a8bda0df7a29306fb721d1a28b8870692496c141df8f0af65a
+AUX line_profiler-1.0-ipython-5.0-compatibility.patch 11633 SHA256 6c9b22ae9af0f21892086dc74ef3f0601b9a5b61e54c5683b4d4be6add5eb56c SHA512 23019c545e348bc794dbb3c251e2f53c245723814c8439e5f00356494c9260a51fbe41efeebb97448bc206b1e1b0e6d8748318c261a5a6ffaee427fbce22bd8f WHIRLPOOL a44cb49041e475b97abca7131050bc052f60e822cd95ca155f015e76d2fb1eaf0e8fc9a6d185760c4f5d3e04339806485ecf9d8c98af695f0c2d4058e2a50375
+DIST line_profiler-1.0.tar.gz 65862 SHA256 a9e0c9ffa814f1215107c86c890afa8e63bec5a37d951f6f9d3668c1df2b1900 SHA512 15dd7ee10951287a5030eaff28e729e82094ec41d8e8dec803d5e44c6b9036ecbf1198365ef43c1fdd28451dec260c6491d118f1762d99fe037bb85eb7908dda WHIRLPOOL 1fd56ea4777a3c569807a124c708018fc77e68521d1f1ecdb13c343ddad3fcd881353cd71a0af36d06a12f1dd17be0f2731040fca5e827a4936298057dabf917
+DIST line_profiler-2.0.tar.gz 68478 SHA256 739f8ad0e4bcd0cb82e99afc09e00a0351234f6b3f0b1f7f0090a8a2fbbf8381 SHA512 c0335fc69fb47c150fa5555af4f7fdf4b172ca12ee6512e04ba854c4a81f3e6ee5594e484d11c8ea7e9e8048e3f3b8661db52332d4ac645195a0e050acea4ecb WHIRLPOOL 6f4a3816fb22c86fe1c691a3e949be41da7680055db5c0909dbfb9af4052cfa50640eca43e0e918e903c23c9e6b8858ebff76e4fa21d8648084ade74f45a2915
+EBUILD line_profiler-1.0-r1.ebuild 683 SHA256 d946ffc6009bc501cf5f9245f56cbddfcd0573af277d96b7586d9158174ae17a SHA512 48263a069ecb191cec782f78ab1056094ee79fd951fc4a3a1cad7355f6595f39bf2f89189f953c7855a8d510be0a9c6aad41c1132e646973d643506df7a20f40 WHIRLPOOL 07f27561c3ffdfe7c6e311995b9d2f206efa1ae696aebd4b6e8b6716901edd8d4398879db77a41292914fe2ecd73a0bb319ee1930caba2b5153ee08b5a085934
+EBUILD line_profiler-1.0.ebuild 568 SHA256 4096df35bd4ec1ac6b1f1ead62c01264cebe218091497856e8b652b6fc07b3aa SHA512 226f5ffc8cd8e12208d3e909504bb9cce15e9f809aaa927cefb7e16bb7ecb63d3c6318cf2ac342b1b84c6a1b5d90e842dbcc39a7acc6a02c5ea5f723ecbe8ebf WHIRLPOOL 446a0ff23a85984474d60b3ff2e86e768eecae0ffa1e194321432bb88e589496a41b9070b4700b5a9c1055d6d305481244a03e3cd80c1e1414d707f7f7060b22
+EBUILD line_profiler-2.0.ebuild 626 SHA256 c14ab4da54d358cbeeadaaf4271abd4ed5fae15a525fd068df25c2e9195f06a5 SHA512 8e93760d55b381eec44ed1f9a2f48850380fc5ca7553def3daca7df9b61d30bde61ce77e64f26029cb42b09ef4ec9e3795b7bd7a3d59682b0bd48f6336561426 WHIRLPOOL 1bc67c108c65795830fa8491f98e12412c81e539d14309e81904d698388f60b94e1aac58045d3f18237a43bf819f872fdcc569b3930720570c43c02b2804ad2a
+EBUILD line_profiler-9999.ebuild 582 SHA256 c1f28470633190bc2aab13cfe097d0d15459a03b6e6f64678712795829bd498f SHA512 4f50a2bf39ceb6d132c74705358d396ed5ff341fd8cda88f29c8cd5427a32e65c37c5c358ea620c3ca8fa85fa52c974bfd711df465c51f1bb778a196ae923662 WHIRLPOOL 148da9efa7b410635ee38d72852c57d111354b064360cb0bbf7c10f9455270c59ca27409f2c2b4b1fc68b9b4534ad5d9fb13c5d2872b58ca0d57390a04e192ac
+MISC ChangeLog 1573 SHA256 530818cc50f32d6f94fcc223bdd927bee164f44fa58b1702b485d9da021b7e65 SHA512 b4b9c6677275f933ecaf800384f4023c68533f986de2fa3d3bbff735cae8c5dc5411d6de4345d3a2d9475b77a86e228163b830341b400ca00b98c88ee5be81ab WHIRLPOOL fcb8ae0e9c058734d356d7434aff8c2e7a4d3993bb9c19dd8e4271e5b056ad1d95b1edac1539b979685d62c5adb07c7870361372874fe134dcce2e08496698e2
+MISC metadata.xml 810 SHA256 05dc5917ee16d3643827b02064945a1d877d9fcbd02710d4e5e0fab32482ee7c SHA512 6369d88b7412ba45e4d38bce909c198dc35db0e163e751f35b17b38739283fbb5b6d7da23e5cf147c4fcc08ebde39c394a8cef1e32d02de273fed1ad55552cea WHIRLPOOL 9005c81388b4d43352b1adf9fa5a94f96e13296db7250a3157bf3213a7d2c830e2224ffceae7bf0ad25b077a89cf5e36eeec7598bac78424808b5c11a9ec4465
diff --git a/dev-python/line_profiler/files/line_profiler-1.0-fix-name-from-copypasta.patch b/dev-python/line_profiler/files/line_profiler-1.0-fix-name-from-copypasta.patch
new file mode 100644
index 000000000000..e51a24f86171
--- /dev/null
+++ b/dev-python/line_profiler/files/line_profiler-1.0-fix-name-from-copypasta.patch
@@ -0,0 +1,25 @@
+From 717df8c2088087ea4bce870400a2c99b36b0e53d Mon Sep 17 00:00:00 2001
+From: Robert Kern <rkern@enthought.com>
+Date: Mon, 21 Dec 2015 19:25:51 +0000
+Subject: [PATCH] BUG: fix name from copypasta.
+
+Fixes #43
+
+Thanks, @anntzer!
+---
+ line_profiler.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/line_profiler.py b/line_profiler.py
+index 4480c7b..aac01c8 100755
+--- a/line_profiler.py
++++ b/line_profiler.py
+@@ -303,7 +303,7 @@ def magic_lprun(self, parameter_s=''):
+ mod = __import__(modname, fromlist=[''])
+ profile.add_module(mod)
+ except Exception as e:
+- raise UsageError('Could not find module %r.\n%s: %s' % (name,
++ raise UsageError('Could not find module %r.\n%s: %s' % (modname,
+ e.__class__.__name__, e))
+
+ # Add the profiler to the builtins for @profile.
diff --git a/dev-python/line_profiler/files/line_profiler-1.0-ipython-5.0-compatibility.patch b/dev-python/line_profiler/files/line_profiler-1.0-ipython-5.0-compatibility.patch
new file mode 100644
index 000000000000..04caa8c6987c
--- /dev/null
+++ b/dev-python/line_profiler/files/line_profiler-1.0-ipython-5.0-compatibility.patch
@@ -0,0 +1,299 @@
+https://github.com/rkern/line_profiler/pull/65
+
+From 677a43104dd537b515c06eaeffa77f8dcfa5a76e Mon Sep 17 00:00:00 2001
+From: Brett Olsen <brett.olsen@invitae.com>
+Date: Tue, 12 Jul 2016 10:18:28 -0700
+Subject: [PATCH 1] Update for compatibility with IPython 5.0
+
+Also tested with IPython 4.1.1. Replaces the depreciated ip.define_magic() method with ip.register_magics() and some modifications to handle the different API required.
+---
+ line_profiler.py | 245 ++++++++++++++++++++++++++++---------------------------
+ 1 file changed, 125 insertions(+), 120 deletions(-)
+
+diff --git a/line_profiler.py b/line_profiler.py
+index aac01c8..7645997 100755
+--- a/line_profiler.py
++++ b/line_profiler.py
+@@ -17,6 +17,8 @@
+ import os
+ import sys
+
++from IPython.core.magic import (Magics, magics_class, line_magic)
++
+ from _line_profiler import LineProfiler as CLineProfiler
+
+ # Python 2/3 compatibility utils
+@@ -226,150 +228,153 @@ def show_text(stats, unit, stream=None, stripzeros=False):
+ for (fn, lineno, name), timings in sorted(stats.items()):
+ show_func(fn, lineno, name, stats[fn, lineno, name], unit, stream=stream, stripzeros=stripzeros)
+
+-# A %lprun magic for IPython.
+-def magic_lprun(self, parameter_s=''):
+- """ Execute a statement under the line-by-line profiler from the
+- line_profiler module.
++@magics_class
++class LineProfilerMagics(Magics):
+
+- Usage:
+- %lprun -f func1 -f func2 <statement>
++ @line_magic
++ def lprun(self, parameter_s=''):
++ """ Execute a statement under the line-by-line profiler from the
++ line_profiler module.
+
+- The given statement (which doesn't require quote marks) is run via the
+- LineProfiler. Profiling is enabled for the functions specified by the -f
+- options. The statistics will be shown side-by-side with the code through the
+- pager once the statement has completed.
++ Usage:
++ %lprun -f func1 -f func2 <statement>
+
+- Options:
++ The given statement (which doesn't require quote marks) is run via the
++ LineProfiler. Profiling is enabled for the functions specified by the -f
++ options. The statistics will be shown side-by-side with the code through the
++ pager once the statement has completed.
+
+- -f <function>: LineProfiler only profiles functions and methods it is told
+- to profile. This option tells the profiler about these functions. Multiple
+- -f options may be used. The argument may be any expression that gives
+- a Python function or method object. However, one must be careful to avoid
+- spaces that may confuse the option parser. Additionally, functions defined
+- in the interpreter at the In[] prompt or via %run currently cannot be
+- displayed. Write these functions out to a separate file and import them.
++ Options:
+
+- -m <module>: Get all the functions/methods in a module
++ -f <function>: LineProfiler only profiles functions and methods it is told
++ to profile. This option tells the profiler about these functions. Multiple
++ -f options may be used. The argument may be any expression that gives
++ a Python function or method object. However, one must be careful to avoid
++ spaces that may confuse the option parser. Additionally, functions defined
++ in the interpreter at the In[] prompt or via %run currently cannot be
++ displayed. Write these functions out to a separate file and import them.
+
+- One or more -f or -m options are required to get any useful results.
++ -m <module>: Get all the functions/methods in a module
+
+- -D <filename>: dump the raw statistics out to a pickle file on disk. The
+- usual extension for this is ".lprof". These statistics may be viewed later
+- by running line_profiler.py as a script.
++ One or more -f or -m options are required to get any useful results.
+
+- -T <filename>: dump the text-formatted statistics with the code side-by-side
+- out to a text file.
++ -D <filename>: dump the raw statistics out to a pickle file on disk. The
++ usual extension for this is ".lprof". These statistics may be viewed later
++ by running line_profiler.py as a script.
+
+- -r: return the LineProfiler object after it has completed profiling.
++ -T <filename>: dump the text-formatted statistics with the code side-by-side
++ out to a text file.
+
+- -s: strip out all entries from the print-out that have zeros.
+- """
+- # Local imports to avoid hard dependency.
+- from distutils.version import LooseVersion
+- import IPython
+- ipython_version = LooseVersion(IPython.__version__)
+- if ipython_version < '0.11':
+- from IPython.genutils import page
+- from IPython.ipstruct import Struct
+- from IPython.ipapi import UsageError
+- else:
+- from IPython.core.page import page
+- from IPython.utils.ipstruct import Struct
+- from IPython.core.error import UsageError
+-
+- # Escape quote markers.
+- opts_def = Struct(D=[''], T=[''], f=[], m=[])
+- parameter_s = parameter_s.replace('"', r'\"').replace("'", r"\'")
+- opts, arg_str = self.parse_options(parameter_s, 'rsf:m:D:T:', list_all=True)
+- opts.merge(opts_def)
+-
+- global_ns = self.shell.user_global_ns
+- local_ns = self.shell.user_ns
+-
+- # Get the requested functions.
+- funcs = []
+- for name in opts.f:
+- try:
+- funcs.append(eval(name, global_ns, local_ns))
+- except Exception as e:
+- raise UsageError('Could not find function %r.\n%s: %s' % (name,
+- e.__class__.__name__, e))
++ -r: return the LineProfiler object after it has completed profiling.
+
+- profile = LineProfiler(*funcs)
++ -s: strip out all entries from the print-out that have zeros.
++ """
++ # Local imports to avoid hard dependency.
++ from distutils.version import LooseVersion
++ import IPython
++ ipython_version = LooseVersion(IPython.__version__)
++ if ipython_version < '0.11':
++ from IPython.genutils import page
++ from IPython.ipstruct import Struct
++ from IPython.ipapi import UsageError
++ else:
++ from IPython.core.page import page
++ from IPython.utils.ipstruct import Struct
++ from IPython.core.error import UsageError
++
++ # Escape quote markers.
++ opts_def = Struct(D=[''], T=[''], f=[], m=[])
++ parameter_s = parameter_s.replace('"', r'\"').replace("'", r"\'")
++ opts, arg_str = self.parse_options(parameter_s, 'rsf:m:D:T:', list_all=True)
++ opts.merge(opts_def)
++
++ global_ns = self.shell.user_global_ns
++ local_ns = self.shell.user_ns
++
++ # Get the requested functions.
++ funcs = []
++ for name in opts.f:
++ try:
++ funcs.append(eval(name, global_ns, local_ns))
++ except Exception as e:
++ raise UsageError('Could not find function %r.\n%s: %s' % (name,
++ e.__class__.__name__, e))
+
+- # Get the modules, too
+- for modname in opts.m:
+- try:
+- mod = __import__(modname, fromlist=[''])
+- profile.add_module(mod)
+- except Exception as e:
+- raise UsageError('Could not find module %r.\n%s: %s' % (modname,
+- e.__class__.__name__, e))
+-
+- # Add the profiler to the builtins for @profile.
+- if PY3:
+- import builtins
+- else:
+- import __builtin__ as builtins
++ profile = LineProfiler(*funcs)
+
+- if 'profile' in builtins.__dict__:
+- had_profile = True
+- old_profile = builtins.__dict__['profile']
+- else:
+- had_profile = False
+- old_profile = None
+- builtins.__dict__['profile'] = profile
++ # Get the modules, too
++ for modname in opts.m:
++ try:
++ mod = __import__(modname, fromlist=[''])
++ profile.add_module(mod)
++ except Exception as e:
++ raise UsageError('Could not find module %r.\n%s: %s' % (modname,
++ e.__class__.__name__, e))
++
++ # Add the profiler to the builtins for @profile.
++ if PY3:
++ import builtins
++ else:
++ import __builtin__ as builtins
++
++ if 'profile' in builtins.__dict__:
++ had_profile = True
++ old_profile = builtins.__dict__['profile']
++ else:
++ had_profile = False
++ old_profile = None
++ builtins.__dict__['profile'] = profile
+
+- try:
+ try:
+- profile.runctx(arg_str, global_ns, local_ns)
+- message = ''
+- except SystemExit:
+- message = """*** SystemExit exception caught in code being profiled."""
+- except KeyboardInterrupt:
+- message = ("*** KeyboardInterrupt exception caught in code being "
+- "profiled.")
+- finally:
+- if had_profile:
+- builtins.__dict__['profile'] = old_profile
+-
+- # Trap text output.
+- stdout_trap = StringIO()
+- profile.print_stats(stdout_trap, stripzeros='s' in opts)
+- output = stdout_trap.getvalue()
+- output = output.rstrip()
+-
+- if ipython_version < '0.11':
+- page(output, screen_lines=self.shell.rc.screen_length)
+- else:
+- page(output)
+- print(message, end="")
++ try:
++ profile.runctx(arg_str, global_ns, local_ns)
++ message = ''
++ except SystemExit:
++ message = """*** SystemExit exception caught in code being profiled."""
++ except KeyboardInterrupt:
++ message = ("*** KeyboardInterrupt exception caught in code being "
++ "profiled.")
++ finally:
++ if had_profile:
++ builtins.__dict__['profile'] = old_profile
++
++ # Trap text output.
++ stdout_trap = StringIO()
++ profile.print_stats(stdout_trap, stripzeros='s' in opts)
++ output = stdout_trap.getvalue()
++ output = output.rstrip()
++
++ if ipython_version < '0.11':
++ page(output, screen_lines=self.shell.rc.screen_length)
++ else:
++ page(output)
++ print(message, end="")
+
+- dump_file = opts.D[0]
+- if dump_file:
+- profile.dump_stats(dump_file)
+- print('\n*** Profile stats pickled to file %r. %s' % (
+- dump_file, message))
++ dump_file = opts.D[0]
++ if dump_file:
++ profile.dump_stats(dump_file)
++ print('\n*** Profile stats pickled to file %r. %s' % (
++ dump_file, message))
+
+- text_file = opts.T[0]
+- if text_file:
+- pfile = open(text_file, 'w')
+- pfile.write(output)
+- pfile.close()
+- print('\n*** Profile printout saved to text file %r. %s' % (
+- text_file, message))
++ text_file = opts.T[0]
++ if text_file:
++ pfile = open(text_file, 'w')
++ pfile.write(output)
++ pfile.close()
++ print('\n*** Profile printout saved to text file %r. %s' % (
++ text_file, message))
+
+- return_value = None
+- if 'r' in opts:
+- return_value = profile
++ return_value = None
++ if 'r' in opts:
++ return_value = profile
+
+- return return_value
++ return return_value
+
+
+ def load_ipython_extension(ip):
+ """ API for IPython to recognize this module as an IPython extension.
+ """
+- ip.define_magic('lprun', magic_lprun)
++ ip.register_magics(LineProfilerMagics)
+
+
+ def load_stats(filename):
diff --git a/dev-python/line_profiler/line_profiler-1.0-r1.ebuild b/dev-python/line_profiler/line_profiler-1.0-r1.ebuild
new file mode 100644
index 000000000000..6dbe4b315ca2
--- /dev/null
+++ b/dev-python/line_profiler/line_profiler-1.0-r1.ebuild
@@ -0,0 +1,32 @@
+# Copyright 1999-2016 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+PYTHON_COMPAT=( python2_7 python3_{4,5} )
+
+inherit distutils-r1
+
+DESCRIPTION="Line-by-line profiler"
+HOMEPAGE="https://github.com/rkern/line_profiler"
+SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
+KEYWORDS="~amd64"
+
+SLOT="0"
+LICENSE="BSD"
+KEYWORDS="~amd64 ~x86"
+IUSE="test"
+
+DEPEND="
+ test? ( dev-python/pytest[${PYTHON_USEDEP}] )
+ "
+
+PATCHES=(
+ "${FILESDIR}/${P}-fix-name-from-copypasta.patch"
+ "${FILESDIR}/${P}-ipython-5.0-compatibility.patch"
+)
+
+python_test() {
+ "${PYTHON}" -m unittest discover -v "${S}"/tests/ \
+ || die "Tests failed with ${EPYTHON}"
+}
diff --git a/dev-python/line_profiler/line_profiler-1.0.ebuild b/dev-python/line_profiler/line_profiler-1.0.ebuild
new file mode 100644
index 000000000000..802d85e74204
--- /dev/null
+++ b/dev-python/line_profiler/line_profiler-1.0.ebuild
@@ -0,0 +1,27 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+PYTHON_COMPAT=( python2_7 python3_{4,5} )
+
+inherit distutils-r1
+
+DESCRIPTION="Line-by-line profiler"
+HOMEPAGE="https://github.com/rkern/line_profiler"
+SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
+KEYWORDS="~amd64"
+
+SLOT="0"
+LICENSE="BSD"
+KEYWORDS="~amd64 ~x86"
+IUSE="test"
+
+DEPEND="
+ test? ( dev-python/pytest[${PYTHON_USEDEP}] )
+ "
+
+python_test() {
+ "${PYTHON}" -m unittest discover -v "${S}"/tests/ \
+ || die "Tests failed with ${EPYTHON}"
+}
diff --git a/dev-python/line_profiler/line_profiler-2.0.ebuild b/dev-python/line_profiler/line_profiler-2.0.ebuild
new file mode 100644
index 000000000000..81d586184a05
--- /dev/null
+++ b/dev-python/line_profiler/line_profiler-2.0.ebuild
@@ -0,0 +1,28 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+PYTHON_COMPAT=( python2_7 python3_{4,5} )
+
+inherit distutils-r1
+
+DESCRIPTION="Line-by-line profiler"
+HOMEPAGE="https://github.com/rkern/line_profiler"
+SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz"
+KEYWORDS="~amd64"
+
+SLOT="0"
+LICENSE="BSD"
+KEYWORDS="~amd64 ~x86"
+IUSE="test"
+
+RDEPEND="dev-python/ipython[${PYTHON_USEDEP}]"
+DEPEND="${RDEPEND}
+ test? ( dev-python/pytest[${PYTHON_USEDEP}] )
+ "
+
+python_test() {
+ "${EPYTHON}" -m unittest discover -v "${S}"/tests/ \
+ || die "Tests failed with ${EPYTHON}"
+}
diff --git a/dev-python/line_profiler/line_profiler-9999.ebuild b/dev-python/line_profiler/line_profiler-9999.ebuild
new file mode 100644
index 000000000000..cbcda89a1905
--- /dev/null
+++ b/dev-python/line_profiler/line_profiler-9999.ebuild
@@ -0,0 +1,27 @@
+# Copyright 1999-2015 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=5
+
+PYTHON_COMPAT=( python2_7 python3_{4,5} )
+
+inherit distutils-r1 git-r3
+
+DESCRIPTION="Line-by-line profiler"
+HOMEPAGE="https://github.com/rkern/line_profiler"
+EGIT_REPO_URI="https://github.com/rkern/${PN}.git"
+
+SLOT="0"
+LICENSE="BSD"
+KEYWORDS=""
+IUSE="test"
+
+DEPEND="
+ dev-python/cython[${PYTHON_USEDEP}]
+ test? ( dev-python/pytest[${PYTHON_USEDEP}] )
+ "
+
+python_test() {
+ "${PYTHON}" -m unittest discover -v "${S}"/tests/ \
+ || die "Tests failed with ${EPYTHON}"
+}
diff --git a/dev-python/line_profiler/metadata.xml b/dev-python/line_profiler/metadata.xml
new file mode 100644
index 000000000000..a5ab15f42671
--- /dev/null
+++ b/dev-python/line_profiler/metadata.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+ <maintainer type="person">
+ <email>marbre@linux.sungazer.de</email>
+ <name>Marius Brehler</name>
+ </maintainer>
+ <maintainer type="project">
+ <email>sci@gentoo.org</email>
+ <name>Gentoo Science Project</name>
+ </maintainer>
+ <longdescription>
+ line_profiler is a module for doing line-by-line profiling of
+ functions. kernprof is a convenient script for running either
+ line_profiler or the Python standard library's cProfile or profile
+ modules, depending on what is available.
+ </longdescription>
+ <upstream>
+ <remote-id type="pypi">line_profiler</remote-id>
+ <remote-id type="github">rkern/line_profiler</remote-id>
+ </upstream>
+</pkgmetadata>