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

Denis Laxalde denis.laxalde at logilab.fr
Wed Feb 14 15:14:28 CET 2018


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.

> 
>>  
>>  
>>  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