Skip to content

Commit

Permalink
Successful storage of namespaces
Browse files Browse the repository at this point in the history
  • Loading branch information
aruiz committed Feb 21, 2012
1 parent cf117f5 commit 2420f7e
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 71 deletions.
20 changes: 13 additions & 7 deletions api/admin.py
Expand Up @@ -2,26 +2,31 @@
from api.models import *
from django.contrib import admin

class NsAdmin(admin.ModelAdmin):
list_display = ('name','version')
admin.site.register(Namespace, NsAdmin)


"""
class SymbolAdmin(admin.ModelAdmin):
list_display = ('name', 'namespaced_name', 'namespace')
class NsAdmin(admin.ModelAdmin):
list_display = ('name',)

class TypeAdmin(admin.ModelAdmin):
list_display = ('c_type',)
list_display = ('name', 'namespaced_name', 'c_type',)
class EnumAdmin(admin.ModelAdmin):
list_display = ('name', 'namespaced_name', 'c_type', 'is_bitfield')
admin.site.register(Node, SymbolAdmin)
admin.site.register(Namespace, NsAdmin)
admin.site.register(Method, SymbolAdmin)
admin.site.register(Callback, TypeAdmin)
admin.site.register(Callable, SymbolAdmin)
admin.site.register(Function, SymbolAdmin)
admin.site.register(Type, SymbolAdmin)
admin.site.register(Type, TypeAdmin)
admin.site.register(Record, SymbolAdmin)
admin.site.register(Value, SymbolAdmin)
admin.site.register(Enumeration, SymbolAdmin)
admin.site.register(Enumeration, TypeAdmin)
admin.site.register(TypedNode, NsAdmin)
admin.site.register(Parameter, NsAdmin)
Expand All @@ -30,3 +35,4 @@ class TypeAdmin(admin.ModelAdmin):
admin.site.register(Class, SymbolAdmin)
admin.site.register(Interface, SymbolAdmin)
"""
13 changes: 11 additions & 2 deletions api/models.py
@@ -1,6 +1,6 @@
# vim: tabstop=4 noexpandtab shiftwidth=4 softtabstop=4
from django.db import models
import giraffe.ast as ast
import giscanner.ast as ast

""" We need to replicate each class of the AST's properties, we use this dict to automate the process. """
"""
Expand Down Expand Up @@ -132,11 +132,20 @@ class Interface(Class):
"""

CF_MAX_LENGTH = 500
PROPERTY_MAPPINS = {}
PROPERTY_MAPPINS = {
ast.Namespace: ('name', 'version'),
}

class Namespace(models.Model):
name = models.CharField (max_length = CF_MAX_LENGTH)
version = models.CharField (max_length = CF_MAX_LENGTH)
#TODO:
#From the parser:
#c includes
#c prefix
#shared libraries?
#pkg-config packages
#doc????

class Type(models.Model):
ctype = models.CharField (max_length = CF_MAX_LENGTH)
Expand Down
85 changes: 23 additions & 62 deletions api/views.py
Expand Up @@ -4,7 +4,7 @@
from django.http import HttpResponse
from django.db import IntegrityError
from giscanner.girparser import GIRParser

import giscanner.ast as ast
"""
AST_TYPE_MAPPINGS = {
ast.Type: models.Type,
Expand All @@ -19,24 +19,6 @@
ast.BitField: models.Enumeration
}
def _store_props(db_obj, ast_obj, ast_classes):
for ast_class in ast_classes:
for prop in models.PROPERTY_MAPPINS[ast_class]:
if getattr(ast_obj, prop) == None:
continue
setattr(db_obj, prop, getattr(ast_obj, prop))
def _store_namespace (ns):
try:
db_ns = models.Namespace.objects.get(name = ns.name)
#TODO: Catch the right exception for this
except:
db_ns = models.Namespace()
_store_props (db_ns, ns, (ast.Namespace,))
db_ns.save()
return db_ns
def _store_type_generic (ast_type, db_ns):
model = AST_TYPE_MAPPINGS[ast_type.__class__]
Expand Down Expand Up @@ -279,52 +261,31 @@ def _store_prerequisite (prereq, db_ns):
return db_prereq
"""

def _store_props(db_obj, ast_obj, ast_classes):
for ast_class in ast_classes:
for prop in models.PROPERTY_MAPPINS[ast_class]:
if getattr(ast_obj, prop) == None:
continue
setattr(db_obj, prop, getattr(ast_obj, prop))

def _store_namespace (ns):
try:
db_ns = models.Namespace.objects.get(name = ns.name, version = ns.version)
return db_ns
except ObjectDoesNotExist:
db_ns = models.Namespace()
_store_props (db_ns, ns, (ast.Namespace,))
db_ns.save()
return db_ns

def parse(request):
"""
for ns in repo.namespaces:
db_ns = _store_namespace (ns)
for fn in ns.functions:
_store_function (fn, db_ns)
for enum in ns.enumerations:
_store_enum (enum, db_ns, isinstance(enum, ast.BitField))
for record in ns.records:
db_record = _store_struct (record, db_ns)
for field in record.fields:
_store_field (field, db_ns, db_record)
for callback in record.callbacks:
_store_callback (callback, db_ns, db_record)
for method in record.methods:
_store_method (method, db_ns, db_record)
for cb in ns.callbacks:
_store_callback (cb, db_ns, None)
for iface in ns.interfaces:
db_iface = _store_class (iface, db_ns, True)
for prereq in iface.prerequisites:
db_prereq = _store_prerequisite (prereq, db_ns)
db_iface.prerequisites.add(db_prereq)
db_iface.save ()
for klass in ns.classes:
db_class = _store_class (klass, db_ns)
for iface in klass.interfaces:
try:
db_iface = models.Interface.objects.get(namespaced_name = iface.namespaced_name)
db_class.interfaces.add(db_iface)
except ObjectDoesNotExist:
info = (iface.namespaced_name, klass.namespaced_name)
print "Couldn't find interface %s implemented by %s", info
continue
db_class.save()
"""
parser = GIRParser()
parser.parse("/usr/share/gir-1.0/Gtk-3.0.gir")
print "Parsed"
print parser.get_namespace()
namespaces = [_store_namespace(parser.get_namespace()),]
for ns in parser.get_includes():
namespaces.append(_store_namespace (ns))

return HttpResponse("GIR to SQL transfusion completed")

def index(request):
Expand Down

0 comments on commit 2420f7e

Please sign in to comment.