Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F62883238
analyse_python_code.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Thu, May 16, 06:58
Size
4 KB
Mime Type
text/x-python
Expires
Sat, May 18, 06:58 (2 d)
Engine
blob
Format
Raw Data
Handle
17703215
Attached To
R1692 code_skeleton
analyse_python_code.py
View Options
#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" analyze a python code """
################################################################
import
inspect
import
imp
import
re
import
os
import
sys
import
class_decriptor
as
cd
from
class_dumper_classes
import
ClassDumperClasses
################################################################
def
get_class_encapsulation
(
name
):
# print "CCCCCCCCCCCc " + name
if
re
.
match
(
'_(.*?)_(.*)'
,
name
):
match
=
re
.
match
(
'_(.*?)_(.*)'
,
name
)
name
=
match
.
group
(
2
)
if
name
[
0
]
==
'_'
:
encaps
=
'private'
name
=
name
[
1
:]
else
:
encaps
=
'protected'
return
name
,
encaps
return
name
,
'public'
################################################################
def
get_encapsulation
(
name
):
# print "CCCCCCCCCCCc " + name
if
re
.
match
(
'_(.*)'
,
name
):
match
=
re
.
match
(
'_(.*)'
,
name
)
name
=
match
.
group
(
1
)
if
name
[
0
]
==
'_'
:
encaps
=
'private'
name
=
name
[
1
:]
else
:
encaps
=
'protected'
return
name
,
encaps
return
name
,
'public'
################################################################
def
analyze_file
(
fnames
,
class_cache
=
{},
**
kwargs
):
print
fnames
modfile
=
fnames
modname
=
os
.
path
.
basename
(
modfile
)
modname
=
os
.
path
.
splitext
(
modname
)[
0
]
mymod
=
imp
.
load_source
(
modname
,
modfile
)
exclude_members
=
[
'__module__'
,
'__doc__'
]
for
k
,
v
,
in
mymod
.
__dict__
.
iteritems
():
if
inspect
.
isclass
(
v
):
print
k
class_desc
=
cd
.
ClassDescriptor
(
k
,
inheritance
=
None
)
for
name
,
memb
in
inspect
.
getmembers
(
v
):
#print name
if
name
in
exclude_members
:
continue
if
inspect
.
ismethod
(
memb
):
args
=
[(
"PyObject"
,
a
)
for
a
in
inspect
.
getargspec
(
memb
)
.
args
if
not
a
==
'self'
]
# print name
encaps
=
'public'
if
name
==
'__init__'
:
name
=
k
lines
=
inspect
.
getsourcelines
(
memb
)
# print lines
for
line
in
lines
[
0
]:
match
=
re
.
match
(
r'\s*self\.(.*)=(.*)'
,
line
)
if
match
:
name
=
match
.
group
(
1
)
member
,
dummy_encaps_member
=
get_encapsulation
(
name
)
# print member,encaps
class_desc
.
addMember
(
member
,
"PyObject"
,
encaps
,
""
,
""
)
elif
re
.
match
(
'__.*__'
,
name
):
pass
else
:
name
,
encaps
=
get_class_encapsulation
(
name
)
class_desc
.
addMethod
(
name
,
args
,
"PyObject"
,
encaps
,
""
,
""
,
""
,
""
)
class_cache
[
k
]
=
class_desc
return
class_cache
################################################################
def
analyzeFiles
(
dirname
,
extension_list
=
[
'.py'
],
output
=
None
,
import_dir
=
None
,
**
kwargs
):
if
import_dir
is
not
None
:
if
isinstance
(
import_dir
,
str
):
import_dir
=
import_dir
.
split
(
':'
)
for
_dir
in
import_dir
:
path
=
os
.
path
.
expanduser
(
_dir
)
sys
.
path
.
append
(
path
)
read_classes
=
{}
if
os
.
path
.
isfile
(
dirname
):
files
=
[
dirname
]
else
:
files
=
[]
for
filename
in
os
.
listdir
(
dirname
):
dummy_base
,
ext
=
os
.
path
.
splitext
(
filename
)
if
ext
in
extension_list
:
files
.
append
(
os
.
path
.
join
(
dirname
,
filename
))
if
os
.
path
.
isfile
(
dirname
):
dirname
=
None
for
filename
in
files
:
analyze_file
(
filename
,
class_cache
=
read_classes
,
dec_dir
=
dirname
,
**
kwargs
)
if
output
is
not
None
:
dumper_class
=
ClassDumperClasses
(
output
)
classes
=
[
c
for
dummy_k
,
c
in
read_classes
.
iteritems
()]
dumper_class
.
dump
(
classes
=
classes
)
################################################################
def
main
():
import
argparse
parser
=
argparse
.
ArgumentParser
(
description
=
'Code analyzer to produce .classes description'
)
parser
.
add_argument
(
'--sources'
,
'-s'
,
help
=
'The directory where the sources are loacted'
,
required
=
True
)
parser
.
add_argument
(
'--output'
,
'-o'
,
type
=
str
,
help
=
'filename to store output'
)
parser
.
add_argument
(
'--import_dir'
,
'-i'
,
type
=
str
,
help
=
'directories to scan for imports'
)
args
=
parser
.
parse_args
()
args
=
vars
(
args
)
src_dir
=
args
[
'sources'
]
analyzeFiles
(
src_dir
,
**
args
)
################################################################
if
__name__
==
'__main__'
:
main
()
Event Timeline
Log In to Comment