Changeset 85e6070 in trunk


Ignore:
Timestamp:
2025-01-24T15:12:10Z (4 months ago)
Author:
Florian Sesser <florian@…>
Children:
290642d
Parents:
50ecf30 (diff), fc030da (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge remote-tracking branch 'origin/master' into 4150.ci-for-debian-trixie

Files:
2 added
11 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified src/allmydata/hashtree.py

    r50ecf30 r85e6070  
    7171
    7272class CompleteBinaryTreeMixin:
    73     """
     73    r"""
    7474    Adds convenience methods to a complete binary tree.
    7575
     
    180180
    181181class HashTree(CompleteBinaryTreeMixin, list):
    182     """
     182    r"""
    183183    Compute Merkle hashes at any node in a complete binary tree.
    184184
  • TabularUnified src/allmydata/interfaces.py

    r50ecf30 r85e6070  
    407407
    408408    def put_uri_extension(data):
    409         """This block of data contains integrity-checking information (hashes
     409        r"""This block of data contains integrity-checking information (hashes
    410410        of plaintext, crypttext, and shares), as well as encoding parameters
    411411        that are necessary to recover the data. This is a serialized dict
  • TabularUnified src/allmydata/node.py

    r50ecf30 r85e6070  
    9191
    9292# group 1 will be addr (dotted quad string), group 3 if any will be portnum (string)
    93 ADDR_RE = re.compile("^([1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*)(:([1-9][0-9]*))?$")
     93ADDR_RE = re.compile(r"^([1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*)(:([1-9][0-9]*))?$")
    9494
    9595# this is put into README in new node-directories (for client and introducers)
  • TabularUnified src/allmydata/test/cli/test_backup.py

    r50ecf30 r85e6070  
    3737    def count_output(self, out):
    3838        mo = re.search(r"(\d)+ files uploaded \((\d+) reused\), "
    39                         "(\d)+ files skipped, "
    40                         "(\d+) directories created \((\d+) reused\), "
    41                         "(\d+) directories skipped", out)
     39                        r"(\d)+ files skipped, "
     40                        r"(\d+) directories created \((\d+) reused\), "
     41                        r"(\d+) directories skipped", out)
    4242        return [int(s) for s in mo.groups()]
    4343
  • TabularUnified src/allmydata/test/cli/test_cli.py

    r50ecf30 r85e6070  
    765765        # COMPLETE or the PENDING state.
    766766        in_complete_msg = "ran out of shares: complete=sh0 pending= overdue= unused= need 3"
    767         in_pending_msg_regex = "ran out of shares: complete= pending=Share\(.+\) overdue= unused= need 3"
     767        in_pending_msg_regex = r"ran out of shares: complete= pending=Share\(.+\) overdue= unused= need 3"
    768768
    769769        d.addCallback(lambda ign: self.do_cli("get", self.uri_1share))
  • TabularUnified src/allmydata/test/test_runner.py

    r50ecf30 r85e6070  
    255255        # punctuation mark.
    256256        for line in err.splitlines():
    257             self.failIf(re.search("[\S][^\.!?]$", line), (line,))
     257            self.failIf(re.search(r"[\S][^\.!?]$", line), (line,))
    258258
    259259        # test that the non --basedir form works too
  • TabularUnified src/allmydata/test/test_time_format.py

    r50ecf30 r85e6070  
    8282        MONTH = 31*DAY
    8383        YEAR = 365*DAY
     84
     85        # seconds
     86        self.failUnlessEqual(p("1s"), 1)
     87        self.failUnlessEqual(p("12 s"), 12)
     88        self.failUnlessEqual(p("333second"), 333)
     89        self.failUnlessEqual(p(" 333 second "), 333)
     90        self.failUnlessEqual(p("5 seconds"), 5)
     91        self.failUnlessEqual(p("60 SECONDS"), 60)
     92        self.failUnlessEqual(p("86400s"), DAY)
     93
     94        # days
    8495        self.failUnlessEqual(p("1 day"), DAY)
    8596        self.failUnlessEqual(p("2 days"), 2*DAY)
    86         self.failUnlessEqual(p("3 months"), 3*MONTH)
    87         self.failUnlessEqual(p("4 mo"), 4*MONTH)
    88         self.failUnlessEqual(p("5 years"), 5*YEAR)
    89         e = self.failUnlessRaises(ValueError, p, "123")
    90         self.failUnlessIn("no unit (like day, month, or year) in '123'",
    91                           str(e))
     97        self.failUnlessEqual(p("5days"), 5*DAY)
    9298        self.failUnlessEqual(p("7days"), 7*DAY)
    9399        self.failUnlessEqual(p("31day"), 31*DAY)
    94100        self.failUnlessEqual(p("60 days"), 60*DAY)
     101        self.failUnlessEqual(p("70 DAYS"), 70*DAY)
     102
     103        # months
     104        self.failUnlessEqual(p("4 mo"), 4*MONTH)
    95105        self.failUnlessEqual(p("2mo"), 2*MONTH)
    96106        self.failUnlessEqual(p("3 month"), 3*MONTH)
     107        self.failUnlessEqual(p("3 months"), 3*MONTH)
     108
     109        # years
     110        self.failUnlessEqual(p("5 years"), 5*YEAR)
     111        self.failUnlessEqual(p("8 year"), 8*YEAR)
    97112        self.failUnlessEqual(p("2years"), 2*YEAR)
     113        self.failUnlessEqual(p("11YEARS"), 11*YEAR)
     114
     115        # errors
     116        e = self.failUnlessRaises(ValueError, p, "123")
     117        self.failUnlessIn("No valid unit in",str(e))
    98118        e = self.failUnlessRaises(ValueError, p, "2kumquats")
    99         self.failUnlessIn("no unit (like day, month, or year) in '2kumquats'", str(e))
     119        self.failUnlessIn("No valid unit in", str(e))
    100120
    101121    def test_parse_date(self):
  • TabularUnified src/allmydata/test/web/test_web.py

    r50ecf30 r85e6070  
    19691969        d = self.GET("/tahoe.css", followRedirect=True)
    19701970        def _check(res):
    1971             CSS_STYLE=re.compile(b'toolbar\s{.+text-align:\scenter.+toolbar-item.+display:\sinline',re.DOTALL)
     1971            CSS_STYLE=re.compile(b'toolbar\\s{.+text-align:\\scenter.+toolbar-item.+display:\\sinline',re.DOTALL)
    19721972            self.failUnless(CSS_STYLE.search(res), res)
    19731973        d.addCallback(_check)
  • TabularUnified src/allmydata/util/i2p_provider.py

    r50ecf30 r85e6070  
    190190        external_port = self._get_i2p_config("dest.port")
    191191        sam_port = self._get_i2p_config("sam.port")
    192         escaped_sam_port = sam_port.replace(':', '\:')
     192        escaped_sam_port = sam_port.replace(':', r'\:')
    193193        # for now, this returns a string, which then gets passed to
    194194        # endpoints.serverFromString . But it can also return an Endpoint
  • TabularUnified src/allmydata/util/time_format.py

    r50ecf30 r85e6070  
    77
    88import calendar, datetime, re, time
     9from typing import Optional
     10from enum import Enum
    911
    10 from typing import Optional
     12
     13class ParseDurationUnitFormat(str, Enum):
     14    SECONDS0 = "s"
     15    SECONDS1 = "second"
     16    SECONDS2 = "seconds"
     17    DAYS0 = "day"
     18    DAYS1 = "days"
     19    MONTHS0 = "mo"
     20    MONTHS1 = "month"
     21    MONTHS2 = "months"
     22    YEARS0 = "year"
     23    YEARS1 = "years"
     24
     25    @classmethod
     26    def list_values(cls):
     27        return list(map(lambda c: c.value, cls))
     28
    1129
    1230def format_time(t):
     
    5169    return calendar.timegm( (year, month, day, hour, minute, second, 0, 1, 0) ) + subsecfloat
    5270
     71
    5372def parse_duration(s):
    54     orig = s
    55     unit = None
     73    """
     74    Parses a duration string and converts it to seconds. The unit format is case insensitive
     75
     76    Args:
     77        s (str): The duration string to parse. Expected format: `<number><unit>`
     78                 where `unit` can be one of the values defined in `ParseDurationUnitFormat`.
     79
     80    Returns:
     81        int: The duration in seconds.
     82
     83    Raises:
     84        ValueError: If the input string does not match the expected format or contains invalid units.
     85    """
     86    SECOND = 1
    5687    DAY = 24*60*60
    5788    MONTH = 31*DAY
    5889    YEAR = 365*DAY
    59     if s.endswith("s"):
    60         s = s[:-1]
    61     if s.endswith("day"):
    62         unit = DAY
    63         s = s[:-len("day")]
    64     elif s.endswith("month"):
    65         unit = MONTH
    66         s = s[:-len("month")]
    67     elif s.endswith("mo"):
    68         unit = MONTH
    69         s = s[:-len("mo")]
    70     elif s.endswith("year"):
    71         unit = YEAR
    72         s = s[:-len("YEAR")]
    73     else:
    74         raise ValueError("no unit (like day, month, or year) in '%s'" % orig)
    75     s = s.strip()
    76     return int(s) * unit
     90    time_map = {
     91        ParseDurationUnitFormat.SECONDS0: SECOND,
     92        ParseDurationUnitFormat.SECONDS1: SECOND,
     93        ParseDurationUnitFormat.SECONDS2: SECOND,
     94        ParseDurationUnitFormat.DAYS0: DAY,
     95        ParseDurationUnitFormat.DAYS1: DAY,
     96        ParseDurationUnitFormat.MONTHS0: MONTH,
     97        ParseDurationUnitFormat.MONTHS1: MONTH,
     98        ParseDurationUnitFormat.MONTHS2: MONTH,
     99        ParseDurationUnitFormat.YEARS0: YEAR,
     100        ParseDurationUnitFormat.YEARS1: YEAR,
     101    }
     102
     103    # Build a regex pattern dynamically from the list of valid values
     104    unit_pattern = "|".join(re.escape(unit) for unit in ParseDurationUnitFormat.list_values())
     105    pattern = rf"^\s*(\d+)\s*({unit_pattern})\s*$"
     106
     107    # case-insensitive regex matching
     108    match = re.match(pattern, s, re.IGNORECASE)
     109    if not match:
     110        # Generate dynamic error message
     111        valid_units = ", ".join(f"'{value}'" for value in ParseDurationUnitFormat.list_values())
     112        raise ValueError(f"No valid unit in '{s}'. Expected one of: ({valid_units})")
     113
     114    number = int(match.group(1))  # Extract the numeric value
     115    unit = match.group(2).lower()  # Extract the unit & normalize the unit to lowercase
     116
     117    return number * time_map[unit]
    77118
    78119def parse_date(s):
  • TabularUnified src/allmydata/web/status.py

    r50ecf30 r85e6070  
    15571557        def mangle_name(name):
    15581558            return re.sub(
    1559                 u"_(\d\d)_(\d)_percentile",
    1560                 u'{quantile="0.\g<1>\g<2>"}',
     1559                r"_(\d\d)_(\d)_percentile",
     1560                r'{quantile="0.\g<1>\g<2>"}',
    15611561                name.replace(u".", u"_")
    15621562            )
Note: See TracChangeset for help on using the changeset viewer.