Changeset 193:bb9d4763dba9

Show
Ignore:
Timestamp:
07/25/09 13:55:18 (13 months ago)
Author:
rgrp
Branch:
default
convert_revision:
svn:0ead1229-0713-0410-96cd-f668dbfad531/trunk@279
Message:

[model][m]: create new Resource object related to Material and remove Resource-related attributes (src_pkg, src_locator) from Material.

  • Create associated migrate scripts (though do not do data migration)
  • cli.py: support for downgrade as well as upgrade (and upgrade to a version)
  • Update all Material/Resource related code (I hope)
Location:
shakespeare
Files:
2 added
6 modified

Legend:

Unmodified
Added
Removed
  • shakespeare/cli.py

    r190 r193  
    7878    # Commands 
    7979 
    80     db_actions = [ 'create', 'upgrade', 'clean', 'rebuild', 'init_shksprdata', 'init_miltondata' ] 
    81     def do_db(self, line=None): 
    82         if line is None or line not in self.db_actions: 
     80    db_actions = [ 'create', 'upgrade', 'downgrade', 'clean', 'rebuild', 'init_shksprdata', 'init_miltondata' ] 
     81    def do_db(self, line=''): 
     82        args = line.split() 
     83        action = args[0] 
     84        if not action in self.db_actions: 
    8385            self.help_db() 
    8486            return 1 
     
    8789        import shakespeare 
    8890        migrate_repository = 'shakespeare/migration/' 
    89         if line == 'create': 
     91        if action == 'create': 
    9092            model.repo.create_db() 
    91         elif line == 'clean': 
     93        elif action == 'clean': 
    9294            model.repo.clean_db() 
    93         elif line == 'rebuild': 
     95        elif action == 'rebuild': 
    9496            model.repo.rebuild_db() 
    95         elif line == 'upgrade': 
     97        elif action == 'upgrade': 
     98            version = None 
     99            if len(args) > 1: 
     100                version = args[1] 
     101            import migrate.versioning.exceptions 
    96102            import migrate.versioning.api 
    97103            import migrate.versioning.api as mig 
     104            try: 
     105                mig.version_control(model.meta.engine.url, migrate_repository) 
     106            except migrate.versioning.exceptions.DatabaseAlreadyControlledError: 
     107                pass 
    98108            mig.upgrade(model.meta.engine.url, migrate_repository, 
    99                     version=None) 
    100         elif line == 'downgrade': 
    101             # TODO (need a version argument ...) 
    102             raise NotImplementedError() 
    103         elif line.startswith('init_'): 
    104             modname = line.strip()[5:] 
     109                    version=version) 
     110        elif action == 'downgrade': 
     111            if len(args) < 2: 
     112                print 'You need to supply a version to downgrade to' 
     113                return 1 
     114            version = args[1] 
     115            import migrate.versioning.api 
     116            import migrate.versioning.api as mig 
     117            mig.downgrade(model.meta.engine.url, migrate_repository, 
     118                    version=version) 
     119        elif action.startswith('init_'): 
     120            modname = action.strip()[5:] 
    105121            mod = __import__(modname+'.cli', fromlist='cli') 
    106122            mod.LoadTexts.load_texts() 
  • shakespeare/controllers/text.py

    r168 r193  
    5151            tfileobj = item.get_text() 
    5252            # hack for time being ... 
    53             if item.format == 'mkd': 
     53            if item.resources and item.resources[0].format == 'mkd': 
    5454                ttext = h.markdown(tfileobj.read()) 
    5555            else: 
  • shakespeare/model/__init__.py

    r190 r193  
    3737            version_table = Table('migrate_version', self.metadata, autoload=True)  
    3838            version_table.drop() 
    39         except sqlalchemy.exceptions.NoSuchTableError: 
     39        except: # seem to occasionally get other sqlalchemy errors ... 
     40        # except sqlalchemy.exceptions.NoSuchTableError: 
    4041            pass 
    4142 
  • shakespeare/model/dm.py

    r192 r193  
    2525    Column('creator', Unicode(255)), 
    2626    Column('notes', UnicodeText), 
     27    ) 
     28 
     29resource_table = Table('resource', metadata, 
     30    Column('id', Integer, primary_key=True), 
     31    Column('material_id', Integer, ForeignKey('material.id')), 
    2732    Column('format', UnicodeText), 
    28     # python package it lives in, if any 
    29     Column('src_pkg', UnicodeText), 
    30     # url (file or web) or standard (unix) file path 
    31     Column('src_locator', UnicodeText), 
     33    # url or path 
     34    Column('locator', UnicodeText), 
     35    # types: url, cache, package, disk 
     36    Column('locator_type', UnicodeText, default=u'url'), 
    3237    ) 
    3338 
     
    7277        # ignore format for time being 
    7378        ''' 
    74         import pkg_resources 
    75         # default to plain txt format (TODO: generalise this) 
    76         fileobj = pkg_resources.resource_stream(self.src_pkg, self.src_locator) 
    77         return fileobj 
     79        if self.resources: 
     80            return self.resources[0].get_stream() 
    7881 
    7982    def get_ftitle(self): 
     
    8184 
    8285    ftitle = property(get_ftitle) 
     86 
     87 
     88class Resource(object): 
     89    def get_stream(self): 
     90        '''Get text (if any) associated with this material. 
     91 
     92        # ignore format for time being 
     93        ''' 
     94        if self.locator_type == u'package': 
     95            package, path = self.locator.split('::') 
     96            import pkg_resources 
     97            fileobj = pkg_resources.resource_stream(package, path) 
     98            return fileobj 
     99        else: 
     100            raise NotImplementedError 
    83101 
    84102 
     
    99117    ) 
    100118 
     119mapper(Resource, resource_table, properties={ 
     120    'material':relation(Material, backref='resources') 
     121    }, 
     122    order_by=resource_table.c.id 
     123    ) 
     124 
    101125mapper(Statistic, statistic_table, properties={ 
    102126    'text':relation(Material, backref='statistics') 
  • shakespeare/templates/text/info.html

    r156 r193  
    2222    <h3>Metadata</h3> 
    2323    <ul> 
    24       <li py:for="attr in ['creator', 'name', 'format', 'notes']"> 
     24      <li py:for="attr in ['creator', 'name', 'notes']"> 
    2525        <strong>${attr.capitalize()}:</strong> 
    2626        ${getattr(c.material, attr)} 
  • shakespeare/tests/test_model.py

    r192 r193  
    1313            title=self.title, 
    1414            work=work, 
    15             src_pkg=u'shksprdata', 
    16             src_locator=u'/gutenberg/phoenix_and_the_turtle_gut.txt' 
     15            ) 
     16        resource = model.Resource( 
     17            material=text, 
     18            locator_type=u'package', 
     19            locator=u'shksprdata::/gutenberg/phoenix_and_the_turtle_gut.txt', 
     20            format=u'txt', 
    1721            ) 
    1822 
     
    2024        self.workid = work.id 
    2125        self.textid = text.id 
     26        self.resourceid = resource.id 
    2227        model.Session.clear() 
    2328 
    2429    @classmethod 
    2530    def teardown_class(self): 
    26         text = model.Material.query.get(self.textid) 
    27         work = model.Material.query.get(self.workid) 
    28         model.Session.delete(text) 
    29         if work: 
    30             model.Session.delete(work) 
    31         model.Session.flush() 
     31        model.repo.rebuild_db() 
    3232     
    3333    def test_work(self): 
     
    4242        assert txt2.title == self.title 
    4343        assert txt2.work.id == self.workid 
     44        assert txt2.resources 
    4445     
    4546    def test_get_text(self): 
     
    4950        assert len(out) > 0 
    5051        assert out[:26] == 'THE PHOENIX AND THE TURTLE' 
     52 
     53    def test_resource(self): 
     54        res = model.Resource.query.get(self.resourceid) 
     55        assert res.format == u'txt' 
    5156 
    5257