[PATCH 10 of 11 saem_ref] [ark] Use random ARK generation for ARKExtIdentifierGenerator

Philippe Pepiot philippe.pepiot at logilab.fr
Wed Feb 14 15:44:00 CET 2018


On 14/02/2018, Denis Laxalde wrote:
> Philippe Pepiot a écrit :
> > On 12/02/2018, Denis Laxalde wrote:
> >> # HG changeset patch
> >> # User Denis Laxalde <denis.laxalde at logilab.fr>
> >> # Date 1518180780 -3600
> >> #      Fri Feb 09 13:53:00 2018 +0100
> >> # Node ID b7e9f5f19a5093cc4c798fed2a84744f9ce95ee2
> >> # Parent  c23060f902915e77cfde70d3e9a2b4252a17f550
> >> # Available At http://hg.logilab.org/review/cubes/saem_ref
> >> #              hg pull http://hg.logilab.org/review/cubes/saem_ref -r b7e9f5f19a50
> >> # EXP-Topic ark/postgres-generated
> >> [ark] Use random ARK generation for ARKExtIdentifierGenerator
> >>
> >> Related to extranet #46881387.
> >>
> >> diff --git a/cubicweb_saem_ref/entities/__init__.py b/cubicweb_saem_ref/entities/__init__.py
> >> --- a/cubicweb_saem_ref/entities/__init__.py
> >> +++ b/cubicweb_saem_ref/entities/__init__.py
> >> @@ -22,6 +22,11 @@ from cubicweb.predicates import match_kw
> >>  from cubicweb.entities import AnyEntity, fetch_config, authobjs, lib
> >>  
> >>  
> >> +ARK_PREFIX = 'rf'
> >> +ARK_CONTROLCHAR = 'g'
> >> +ARK_NAME_LENGTH = 10
> >> +
> >> +
> >>  def make_ark(name):
> >>      return u'rf{name}g'.format(name=name)
> >>  
> >> @@ -46,11 +51,12 @@ class ARKExtIdentifierGenerator(ARKGener
> >>  
> >>      def assign_name(self):
> >>          """Return a new unique identifier as unicode"""
> >> -        dbh = self._cw.repo.system_source.dbhelper
> >> -        for sql in dbh.sqls_increment_sequence('ext_ark_count'):
> >> -            cu = self._cw.system_sql(sql)
> >> -        count = cu.fetchone()[0]
> >> -        return make_ark(u'{0:09d}'.format(count))
> >> +        cu = self._cw.system_sql(
> >> +            'select * from gen_ark(%s, %s, %s);',
> >> +            (ARK_NAME_LENGTH, ARK_PREFIX, ARK_CONTROLCHAR),
> >> +        )
> >> +        ark_name, = cu.fetchone()
> >> +        return ark_name
> > 
> > ark_name variable looks useless, just return cu.fetchone()
> 
> Not quite. This line (ark_name, = cu.fetchone()) ensures that the result
> contains only one item so this is a kind of sanity check.
> 

Oh ok, didn't notice the ', =', forget about this.

> > 
> >>  
> >>  
> >>  class ARKCWIdentifierGenerator(ARKGeneratorMixIn, Adapter):
> >> diff --git a/test/test_views.py b/test/test_views.py
> >> --- a/test/test_views.py
> >> +++ b/test/test_views.py
> >> @@ -480,20 +480,25 @@ class AssignArkWebServiceTC(CubicWebTC):
> >>          with self.admin_access.cnx() as cnx:
> >>              org_ark = testutils.authority_with_naa(cnx).ark
> >>              cnx.commit()
> >> +
> >> +        def check_ark(response_body):
> >> +            json_response = json.loads(result)
> >> +            self.assertIn('ark', json_response[0])
> >> +            ark = json_response[0]['ark']
> >> +            self.assertTrue(testutils.match_ark(ark), ark)
> >> +
> > 
> > You also have to check that len(json_response) == 1 and responses[0].keys()
> > == ['ark']
> > 
> >>          params = {'organization': org_ark}
> >>          with self.admin_access.web_request(
> >>                  headers={'Accept': 'application/json'},
> >>                  method='POST', **params) as req:
> >>              result = self.app_handle_request(req, 'ark')
> >> -            self.assertEqual(json.loads(result),
> >> -                             [{'ark': '0/rf000000001g'}])
> >> +            check_ark(result)
> >>          params = {'organization': 'ark:/' + org_ark}
> >>          with self.admin_access.web_request(
> >>                  headers={'Accept': 'application/json'},
> >>                  method='POST', **params) as req:
> >>              result = self.app_handle_request(req, 'ark')
> >> -            self.assertEqual(json.loads(result),
> >> -                             [{'ark': '0/rf000000002g'}])
> >> +            check_ark(result)
> >>  
> >>  
> >>  class ListArchivalUnitsServiceTC(CubicWebTC):
> >> diff --git a/test/testutils.py b/test/testutils.py
> >> --- a/test/testutils.py
> >> +++ b/test/testutils.py
> >> @@ -18,6 +18,7 @@
> >>  from __future__ import print_function
> >>  
> >>  from os.path import join, dirname, exists
> >> +import re
> >>  import sys
> >>  
> >>  from doctest import Example
> >> @@ -31,6 +32,11 @@ from cubicweb import NoResultError, devt
> >>  from cubicweb.devtools import testlib
> >>  
> >>  from cubicweb_seda import testutils as seda_testutils
> >> +from cubicweb_saem_ref.entities import (
> >> +    ARK_PREFIX,
> >> +    ARK_CONTROLCHAR,
> >> +    ARK_NAME_LENGTH,
> >> +)
> >>  
> >>  # make some names them appear in this module namespace to ease test API
> >>  assertValidationError = seda_testutils.assertValidationError
> >> @@ -116,6 +122,18 @@ def authority_with_naa(cnx, name=u'Defau
> >>      return authority
> >>  
> >>  
> >> +ARK_RGX = re.compile(
> >> +    r'^0/%s.{%d}%s$'
> >> +    % (ARK_PREFIX,
> >> +       ARK_NAME_LENGTH - len(ARK_PREFIX) - len(ARK_CONTROLCHAR),
> >> +       ARK_CONTROLCHAR),
> >> +)
> >> +
> >> +
> >> +def match_ark(text):
> >> +    return ARK_RGX.match(text)
> >> +
> >> +
> >>  def setup_scheme(cnx, title, *labels, **kwargs):
> >>      """Return info new concept scheme"""
> >>      scheme = cnx.create_entity('ConceptScheme', title=title, ark_naa=naa(cnx), **kwargs)
> >> diff --git a/test/unittest_entities.py b/test/unittest_entities.py
> >> --- a/test/unittest_entities.py
> >> +++ b/test/unittest_entities.py
> >> @@ -28,6 +28,9 @@ class ArkGeneratorTC(CubicWebTC):
> >>  
> >>      configcls = PostgresApptestConfiguration
> >>  
> >> +    def assertIsArk(self, text):
> >> +        self.assertRegexpMatches(text, r'^saemref-test/rf.{7}g$')
> >> +
> >>      def test_eid(self):
> >>          with self.admin_access.repo_cnx() as cnx:
> >>              generator = self.vreg['adapters'].select(
> >> @@ -39,7 +42,7 @@ class ArkGeneratorTC(CubicWebTC):
> >>          with self.admin_access.repo_cnx() as cnx:
> >>              generator = self.vreg['adapters'].select('IARKGenerator', cnx,
> >>                                                       naa_what='saemref-test')
> >> -            self.assertEqual(generator.generate_ark(), 'saemref-test/rf000000001g')
> >> +            self.assertIsArk(generator.generate_ark())
> >>  
> >>  
> >>  if __name__ == '__main__':
> >>
> 



More information about the saem-devel mailing list