Changeset 85e6070 in trunk
- Timestamp:
- 2025-01-24T15:12:10Z (4 months ago)
- 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. - Files:
-
- 2 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/allmydata/hashtree.py ¶
r50ecf30 r85e6070 71 71 72 72 class CompleteBinaryTreeMixin: 73 """73 r""" 74 74 Adds convenience methods to a complete binary tree. 75 75 … … 180 180 181 181 class HashTree(CompleteBinaryTreeMixin, list): 182 """182 r""" 183 183 Compute Merkle hashes at any node in a complete binary tree. 184 184 -
TabularUnified src/allmydata/interfaces.py ¶
r50ecf30 r85e6070 407 407 408 408 def put_uri_extension(data): 409 """This block of data contains integrity-checking information (hashes409 r"""This block of data contains integrity-checking information (hashes 410 410 of plaintext, crypttext, and shares), as well as encoding parameters 411 411 that are necessary to recover the data. This is a serialized dict -
TabularUnified src/allmydata/node.py ¶
r50ecf30 r85e6070 91 91 92 92 # 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]*))?$")93 ADDR_RE = re.compile(r"^([1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*)(:([1-9][0-9]*))?$") 94 94 95 95 # this is put into README in new node-directories (for client and introducers) -
TabularUnified src/allmydata/test/cli/test_backup.py ¶
r50ecf30 r85e6070 37 37 def count_output(self, out): 38 38 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) 42 42 return [int(s) for s in mo.groups()] 43 43 -
TabularUnified src/allmydata/test/cli/test_cli.py ¶
r50ecf30 r85e6070 765 765 # COMPLETE or the PENDING state. 766 766 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" 768 768 769 769 d.addCallback(lambda ign: self.do_cli("get", self.uri_1share)) -
TabularUnified src/allmydata/test/test_runner.py ¶
r50ecf30 r85e6070 255 255 # punctuation mark. 256 256 for line in err.splitlines(): 257 self.failIf(re.search( "[\S][^\.!?]$", line), (line,))257 self.failIf(re.search(r"[\S][^\.!?]$", line), (line,)) 258 258 259 259 # test that the non --basedir form works too -
TabularUnified src/allmydata/test/test_time_format.py ¶
r50ecf30 r85e6070 82 82 MONTH = 31*DAY 83 83 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 84 95 self.failUnlessEqual(p("1 day"), DAY) 85 96 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) 92 98 self.failUnlessEqual(p("7days"), 7*DAY) 93 99 self.failUnlessEqual(p("31day"), 31*DAY) 94 100 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) 95 105 self.failUnlessEqual(p("2mo"), 2*MONTH) 96 106 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) 97 112 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)) 98 118 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)) 100 120 101 121 def test_parse_date(self): -
TabularUnified src/allmydata/test/web/test_web.py ¶
r50ecf30 r85e6070 1969 1969 d = self.GET("/tahoe.css", followRedirect=True) 1970 1970 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) 1972 1972 self.failUnless(CSS_STYLE.search(res), res) 1973 1973 d.addCallback(_check) -
TabularUnified src/allmydata/util/i2p_provider.py ¶
r50ecf30 r85e6070 190 190 external_port = self._get_i2p_config("dest.port") 191 191 sam_port = self._get_i2p_config("sam.port") 192 escaped_sam_port = sam_port.replace(':', '\:')192 escaped_sam_port = sam_port.replace(':', r'\:') 193 193 # for now, this returns a string, which then gets passed to 194 194 # endpoints.serverFromString . But it can also return an Endpoint -
TabularUnified src/allmydata/util/time_format.py ¶
r50ecf30 r85e6070 7 7 8 8 import calendar, datetime, re, time 9 from typing import Optional 10 from enum import Enum 9 11 10 from typing import Optional 12 13 class 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 11 29 12 30 def format_time(t): … … 51 69 return calendar.timegm( (year, month, day, hour, minute, second, 0, 1, 0) ) + subsecfloat 52 70 71 53 72 def 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 56 87 DAY = 24*60*60 57 88 MONTH = 31*DAY 58 89 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] 77 118 78 119 def parse_date(s): -
TabularUnified src/allmydata/web/status.py ¶
r50ecf30 r85e6070 1557 1557 def mangle_name(name): 1558 1558 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>"}', 1561 1561 name.replace(u".", u"_") 1562 1562 )
Note: See TracChangeset
for help on using the changeset viewer.