root / rdfalchemy / trunk / rdfalchemy / commands.py

Revision 134, 3.3 kB (checked in by phil, 7 months ago)

fixed load bug

Line 
1from paste.script.command import Command, BadCommand
2import sys
3from rdfalchemy import  rdfSubject, RDF, RDFS, Namespace, URIRef
4from rdfalchemy.rdfsSubject import rdfsSubject, rdfsClass
5
6OWL = Namespace("http://www.w3.org/2002/07/owl#")
7
8
9class rdfSubjectCommand(Command):
10    """Create an rdfSubject subclass with descriptors from an RDF Schema
11
12    will set the rdf_type
13    Descriptors will be created
14   
15      1.  rdfs:domain and rdfs:range are respected
16      2.  rdfSingle is used for properties that are
17            * owl:InverseFunctionalProperty
18            * owl:FunctionalProperty   
19      3.  rdfList or rdfContainer is used if the proper range is set
20      4.  rdfMultiple is used for all others
21     
22    The resulting .py file is ment to be a skeleton for the developers confvience. 
23    Do not expect to be able to use the raw results.
24    """
25    summary = __doc__.splitlines()[0]
26    usage = '\npaster %s\n%s' % (__name__, __doc__)
27
28    min_args = 0
29    max_args = 1
30    group_name = 'rdfalchemy'
31   
32    parser = Command.standard_parser(simulate=True)
33    parser.add_option('-s','--schema',help='file name or url of rdfSchema for this class')
34    parser.add_option('-o','--fout',help='output file name default: stdout (e.g. ../MyRdfModel.py)')
35    parser.add_option('-l','--list', action='store_true', help='list valid instances of `owl:Class` in the schema file')   
36
37    def command(self):
38        """Main command to create controller"""
39        try:
40            if self.options.schema:
41                ext = self.options.schema.split('.')[-1]
42                ext = ext in ['n3','nt'] and ext or 'xml'
43                print "rdfSubject.db.load('%s',format='%s')" % (self.options.schema, ext)
44                rdfSubject.db.load(self.options.schema,format=ext)
45            else:
46                raise NotImplemented('Need to pass in the schema No default yet')
47                   
48            choices  = filter(lambda x: isinstance(x, URIRef), rdfSubject.db.subjects(RDF.type, RDFS.Class))
49            choices += filter(lambda x: isinstance(x, URIRef), rdfSubject.db.subjects(RDF.type, OWL.Class))
50            choices  = filter(lambda x: not rdfSubject.db.qname(x).startswith('_'), choices)
51            choices.sort()
52           
53            print "qnames that you can import from this schema:"
54            for i, n in enumerate(choices):
55                print "\t[%i] %s" % (i+1,rdfSubject.db.qname(n))
56               
57            if self.options.list:
58                return
59           
60            name = self.challenge('Enter (a)ll,(q)uit or the number ot build for','q')
61            if name.startswith('q'):
62                return
63            elif name.startswith('a'):
64                raise NotImplemented("(a)ll option not implented yet")
65            else:
66                try:
67                    name = choices[int(name)-1]
68                except Exception, e:
69                    raise e
70
71            c = rdfsClass("<%s>"%name)
72
73            output = self.options.fout and file(self.options.fout,'w') or sys.stdout               
74            print >>output, c._emit_rdfSubject()
75               
76            # Setup the controller
77        except BadCommand, e:
78            raise BadCommand('An error occurred. %s' % e)
79        except:
80            msg = str(sys.exc_info()[1])
81            raise BadCommand('An unknown error occurred. %s' % msg)
Note: See TracBrowser for help on using the browser.