From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) by finch.gentoo.org (Postfix) with ESMTP id BDEA7138202 for ; Wed, 10 Jul 2013 16:16:56 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 51A6EE0A03; Wed, 10 Jul 2013 16:16:56 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 86588E09FF for ; Wed, 10 Jul 2013 16:16:55 +0000 (UTC) Received: from hornbill.gentoo.org (hornbill.gentoo.org [94.100.119.163]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 6C24A33E8AE for ; Wed, 10 Jul 2013 16:16:54 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by hornbill.gentoo.org (Postfix) with ESMTP id 103F5E5462 for ; Wed, 10 Jul 2013 16:16:53 +0000 (UTC) From: "André Erdmann" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "André Erdmann" Message-ID: <1373463137.1c14f3a2bae0517890589572d90c5f07bdff6f85.dywi@gentoo> Subject: [gentoo-commits] proj/R_overlay:master commit in: roverlay/depres/simpledeprule/ X-VCS-Repository: proj/R_overlay X-VCS-Files: roverlay/depres/simpledeprule/reader.py roverlay/depres/simpledeprule/rulemaker.py X-VCS-Directories: roverlay/depres/simpledeprule/ X-VCS-Committer: dywi X-VCS-Committer-Name: André Erdmann X-VCS-Revision: 1c14f3a2bae0517890589572d90c5f07bdff6f85 X-VCS-Branch: master Date: Wed, 10 Jul 2013 16:16:53 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: 42c427e9-355a-4ab2-a859-6d15c86db9b7 X-Archives-Hash: 48acc47ea6fd4879452be9573746b680 Message-ID: <20130710161653.ne4CPV6qJsTr3D_kmwPuG9gRvYkDM_6LDOW7DmwoxxE@z> commit: 1c14f3a2bae0517890589572d90c5f07bdff6f85 Author: André Erdmann mailerd de> AuthorDate: Wed Jul 10 13:29:27 2013 +0000 Commit: André Erdmann mailerd de> CommitDate: Wed Jul 10 13:32:17 2013 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/R_overlay.git;a=commit;h=1c14f3a2 roverlay/depres/simpledeprule: use util.mapreader * rulemaker: use common code provided by util.mapreader.MapfileParser * reader: offload file reading/parsing to rulemaker, skip vcs directories when scanning directories for rule files --- roverlay/depres/simpledeprule/reader.py | 96 +++-------------------- roverlay/depres/simpledeprule/rulemaker.py | 120 +++++++++++++---------------- 2 files changed, 61 insertions(+), 155 deletions(-) diff --git a/roverlay/depres/simpledeprule/reader.py b/roverlay/depres/simpledeprule/reader.py index d7edc48..e22877b 100644 --- a/roverlay/depres/simpledeprule/reader.py +++ b/roverlay/depres/simpledeprule/reader.py @@ -13,12 +13,9 @@ rules from a file. __all__ = [ 'SimpleDependencyRuleReader', ] import os -import sys import logging -import gzip -import bz2 -import mimetypes +import roverlay.util from roverlay.depres.simpledeprule.rulemaker import SimpleRuleMaker @@ -29,19 +26,15 @@ class SimpleDependencyRuleReader ( object ): """ A SimpleDependencyRuleReader reads such rules from a file.""" self.logger = logging.getLogger ( self.__class__.__name__ ) - # note that breakparse is reader-specific (not in SimpleRuleMaker) - self.breakparse = set (( '#! NOPARSE', '#! BREAK' )) - self._rmaker = SimpleRuleMaker() - self._mimetypes = mimetypes.MimeTypes() - self.guess_ftype = self._mimetypes.guess_type + # bind read method of the rule maker + self.read_file = self._rmaker.read_file self._pool_add = pool_add self._when_done = when_done self._fcount = 0 - # --- end of __init__ (...) --- def read ( self, files_or_dirs ): @@ -58,11 +51,12 @@ class SimpleDependencyRuleReader ( object ): for k in files_or_dirs: if os.path.isdir ( k ): - # without recursion - for fname in os.listdir ( k ): - f = k + os.sep + fname - if os.path.isfile ( f ): - self.read_file ( f ) + if not roverlay.util.is_vcs_dir ( k ): + # without recursion + for fname in os.listdir ( k ): + f = k + os.sep + fname + if os.path.isfile ( f ): + self.read_file ( f ) else: self.read_file ( k ) @@ -78,75 +72,3 @@ class SimpleDependencyRuleReader ( object ): else: return pools # --- end of read (...) --- - - def read_file ( self, filepath ): - """Reads a file that contains simple dependency rules - (SimpleIgnoreDependencyRules/SimpleDependencyRules). - - arguments: - * filepath -- file to read - """ - - # line number is used for logging - lineno = 0 - - self._fcount += 1 - - try: - self.logger.debug ( - "Reading simple dependency rule file {!r}.".format ( filepath ) - ) - ftype = self.guess_ftype ( filepath ) - - compressed = True - - if ftype [1] == 'bzip2': - fh = bz2.BZ2File ( filepath, mode='r' ) - elif ftype [1] == 'gzip': - fh = gzip.GzipFile ( filepath, mode='r' ) - else: - fh = open ( filepath, 'r' ) - compressed = False - - - if compressed and sys.version_info >= ( 3, ): - readlines = ( l.decode().strip() for l in fh.readlines() ) - else: - readlines = ( l.strip() for l in fh.readlines() ) - - for line in readlines: - lineno += 1 - - if not line: - # empty (the rule maker catches this, too) - pass - - elif line in self.breakparse: - # stop reading here - break - - elif not self._rmaker.add ( line ): - self.logger.error ( - "In {!r}, line {}: cannot use this line.".format ( - filepath, lineno - ) - ) - - if fh: fh.close() - - except IOError as ioerr: - if lineno: - self.logger.error ( - "Failed to read file {!r} after {} lines.".format ( - filepath, lineno - ) - ) - else: - self.logger.error ( - "Could not read file {!r}.".format ( filepath ) - ) - raise - finally: - if 'fh' in locals() and fh: fh.close() - - # --- end of read_file (...) --- diff --git a/roverlay/depres/simpledeprule/rulemaker.py b/roverlay/depres/simpledeprule/rulemaker.py index ed39791..3f9ab73 100644 --- a/roverlay/depres/simpledeprule/rulemaker.py +++ b/roverlay/depres/simpledeprule/rulemaker.py @@ -15,6 +15,8 @@ __all__ = [ 'SimpleRuleMaker', ] import re import logging +import roverlay.util.mapreader + from roverlay import config from roverlay.depres import deptype @@ -22,15 +24,14 @@ from roverlay.depres.simpledeprule import rules from roverlay.depres.simpledeprule.abstractrules import * from roverlay.depres.simpledeprule.pool import SimpleDependencyRulePool -class SimpleRuleMaker ( object ): +class SimpleRuleMaker ( roverlay.util.mapreader.MapFileParser ): + + breakparse = set (( '! NOPARSE', '! BREAK' )) def __init__ ( self, rule_separator=None ): + super ( SimpleRuleMaker, self ).__init__() self.logger = logging.getLogger ( self.__class__.__name__ ) - self.single_line_separator = re.compile ( - '\s+::\s+' if rule_separator is None else rule_separator - ) - self.DEPTYPE_MAP = { 'all' : deptype.ALL, 'sys' : deptype.external, @@ -38,9 +39,6 @@ class SimpleRuleMaker ( object ): 'selfdep' : deptype.selfdep, } - self.multiline_start = '{' - self.multiline_stop = '}' - self.comment_char = '#' self.kw_selfdep_once = '@selfdep' self._kwmap = rules.RuleConstructor ( eapi = config.get_or_fail ( 'EBUILD.eapi' ) @@ -49,37 +47,23 @@ class SimpleRuleMaker ( object ): self.deptype_kw = 'deptype' self._deptype = deptype.ALL self._deptype_once = deptype.NONE - self._next = None - # [ ( deptype, rule ), ... ] - self._rules = list() # --- end of __init__ (...) --- - def zap ( self ): - if self._next is not None: - self.logger.warning ( - "Multi line rule does not end at EOF - ignored" - ) - self._next = None - self._rules = list() - # --- end of zap (...) --- - - def done ( self, as_pool=False ): - rule_count = len ( self._rules ) + def make_result ( self, as_pool=False ): + rule_count = len ( self._items ) if as_pool: poolmap = dict() - for dtype, rule in self._rules: + for dtype, rule in self._items: if dtype not in poolmap: poolmap [dtype] = SimpleDependencyRulePool ( name=str ( id ( self ) ), deptype_mask=dtype ) poolmap [dtype].add ( rule ) - ret = ( rule_count, tuple ( poolmap.values() ) ) + return ( rule_count, tuple ( poolmap.values() ) ) else: - ret = self._rules - self.zap() - return ret - # --- end of done (...) --- + return self._items + # --- end of make_result (...) --- def _parse_deptype ( self, deptype_str ): ret = deptype.NONE @@ -104,7 +88,7 @@ class SimpleRuleMaker ( object ): return self._deptype # --- end of _get_effective_deptype (...) --- - def _single_line_rule ( self, dep, dep_str='' ): + def handle_entry_line ( self, dep, dep_str='' ): # single line rule, either selfdep, # e.g. '~zoo' -> fuzzy sci-R/zoo :: zoo # or normal rule 'dev-lang/R :: R' @@ -141,52 +125,52 @@ class SimpleRuleMaker ( object ): return False new_rule.done_reading() - self._rules.append ( ( rule_deptype, new_rule ) ) + self._items.append ( ( rule_deptype, new_rule ) ) return True - # --- end of _single_line_rule (...) --- + # --- end of handle_entry_line (...) --- - def add ( self, line ): - if len ( line ) == 0: - return True - elif self._next is not None: - if line [0] == self.multiline_stop: - # end of a multiline rule, - # add rule to rules and set next_rule to None - self._next [1].done_reading() - self._rules.append ( self._next ) - self._next = None - else: - # new resolved str - self._next [1].add_resolved ( line ) + def handle_multiline_begin ( self, line ): + rule_class, resolving, kwargs = self._kwmap.lookup ( line ) - return True + self._next = ( + self._get_effective_deptype(), + rule_class ( resolving_package=resolving, **kwargs ), + ) + return True + # --- end of handle_multiline_begin (...) --- - elif line [0] == self.comment_char: - if line [ 1 : 1 + len ( self.deptype_kw ) ] == self.deptype_kw : - # changing deptype ("#deptype ") - dtype_str = line [ len ( self.deptype_kw ) + 2 : ].lstrip().lower() - self._deptype = self._parse_deptype ( dtype_str ) + def handle_multiline_end ( self, line ): + self._next [1].done_reading() + self._items.append ( self._next ) + self._next = None + return True + # --- end of handle_multiline_end (...) --- - # else is a comment, - # it's intented that multi line rules cannot contain comments - return True + def handle_multiline_append ( self, line ): + self._next [1].add_resolved ( line ) + return True + # --- end of handle_multiline_append (...) --- - elif line == self.kw_selfdep_once: - self._deptype_once = self._deptype | deptype.selfdep - return True + def handle_comment_line ( self, line ): + if line[:len ( self.deptype_kw ) ] == self.deptype_kw: + # changing deptype ("#deptype ") + dtype_str = line.partition ( ' ' )[2].lower() + self._deptype = self._parse_deptype ( dtype_str ) - elif len ( line ) > 1 and line [-1] == self.multiline_start: - l = line [:-1].rstrip() - rule_class, resolving, kwargs = self._kwmap.lookup ( l ) + elif line in self.breakparse: + self.stop_reading = True - self._next = ( - self._get_effective_deptype(), - rule_class ( resolving_package=resolving, **kwargs ), - ) - return True + # else is a "real" comment + return True + # --- end of handle_comment_line (...) --- + def handle_option_line ( self, line ): + if line == self.kw_selfdep_once: + self._deptype_once = self._deptype | deptype.selfdep + return True else: - return self._single_line_rule ( - *self.single_line_separator.split ( line, 1 ) - ) - # --- end of add (...) --- + return False + # --- end of handle_option_line (...) --- + + +# --- end of SimpleRuleMaker ---